發新話題

Java 教程《語法說明》Overriding a Method

Java 教程《語法說明》Overriding a Method

■ Overriding a Method
[說明]
1. 衍生類別和父類別中某個 method 有相同的 method 名稱和參數列(亦即有同樣的參數個數和參數資料型別)時,且 method 的
 傳回型態符合 Java 規範,則衍生類別將覆寫(override)父類別中的 method。
 Java 1.4 及其之前的版本,不允許 override 的 method 其傳回型態不同;但 Java 1.5 允許 override 的 method 變更傳回型態,但
 衍生類別的 override 的 method 其傳回型態必須只能是基底類別原 method 傳回型態的衍生類別(不能是父類別),此種情形稱作 covariant return。
2. 若 method 加上修飾字 final,可防止該 method 被衍生類別所覆寫(override)。
3. 類別方法(static method)覆寫(override/或稱隱藏-hide)無法達到多型功能。
 static methods 不能 override 為 non-static methods。

[範例]
class A {
  void show( ) {
    System.out.println("Class A's method.");
  }
}

class B extends A {
  void show( ) {
    System.out.println("Class B's method.");
  }
}

class Demo {
  public static void main (String args[ ]) {
    A obj = new B( );
    obj.show( );  // Class B's method.
  }
}

[範例]
class A {
     int a = 0;
     A( ) { }
     A(int a) {
         this.a = a;
     }
     void myInstanceMethod( ) {
         System.out.println("Class A's instance method.");
     }
    static void myStaticMethod( ){
        System.out.println("Class A's static method.");
    }
}

class B extends A {
   int a = 0;
   B(int a){
       a = this.a;
   }
   void myInstanceMethod( ) {
        System.out.println("Class B's instance method.");
   }
   static void myStaticMethod( ){
        System.out.println("Class B's static method.");
    }

}

class Demo {
    public static void main (String args[ ]) {
        A obj = new B(20);
        obj.myInstanceMethod( );     //Class B's instance method
        obj.myStaticMethod( );    //Class A's static method
        ((B)obj).myInstanceMethod( );    //Class B's instance method
        ((B)obj).myStaticMethod( );    //Class B's static method
    }
}

[範例]
class Super {   }
class Sub1 extends Super {    }
class Sub2 extends Sub1 {   }
class A {
     Super myInstanceMethod( ) {
         ......
         return new Super( );
     }
}

class B extends A {
   Sub1 myInstanceMethod( ) {
       ......
       return new Sub2( );   // OK
   }
}

[範例]
class Super { }
class Sub1 extends Super {
}
class Sub2 extends Sub1 {
}
class A {
     Super myInstanceMethod( ) {
         ......
         return new Super( );
     }
}

class B extends A {
   Sub2 myInstanceMethod( ) {
         ......
        return (Sub2)new Sub1( );
   }
}

class Demo {
    public static void main (String args[ ]) {
        A obj = new B( );
        obj.myInstanceMethod( );    // compile OK, but runtime error--產生 ClassCastException
    }
}

[範例]
class Super {
}
class Sub extends Super {
}
class A {
     Super myInstanceMethod( ) {
         System.out.println("Class A's instance method.");
         return new Super( );
     }
}

class B extends A {
   Sub myInstanceMethod( ) {    // covariant return -- Java 5 新增
        System.out.println("Class B's instance method.");
        return new Sub( );
   }
}

class Demo {
    public static void main (String args[ ]) {
        A obj = new B( );
        obj.myInstanceMethod( );    //Class B's instance method
    }
}

[範例]
class Super { }
class Sub1 extends Super {
}
class Sub2 extends Super {
}
class A {
     Sub1 myInstanceMethod( ) {
         ......
         return new Sub1( );
     }
}

class B extends A {
   Sub2 myInstanceMethod( ) {  // error, use incompatible return type
        ......
        return new Sub2( );
   }
}

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。