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( );
}
}