package access;
class A{
public A(){System.out.println("A created!");}
public int f(){
System.out.println("call A.f()");
return 1;
}
}
class B extends A{
public int f(){
System.out.println("call B.f()");
return 2;
}
public B(){System.out.println("B created!");}
}
class C extends B{
public int f(){
System.out.println("call C.f()");
return 3;
}
}
public class Test01{
public static void main(String args[]){
C c = new C();
System.out.println(((A)c).f());
}
}
將c轉型成A,試圖調用A中的f(),結果沒有如我所願,為什麼呢?
首先在子類中調用被重寫的父類方法,這個想法就非常怪,既然被重寫了肯定是想調用重寫後的想法,如果真的還想調用父類被重寫的方法,最直接的還是:
A a = new A();
System.out.println(a.f());
就ok。
(A(c)).f();這裡你只是把c的類型強制轉換成了它的父類,但c本身是重寫了f()方法的,你再轉換它類型也是沒用的,C只會調用它自己的f()方法。具體super關鍵字一般在構造函數裡面用調用父類的構造函數,所以這裡壓根就不起作用。