void a(){
System.out.println("parent'a()");
}
}
class AA extends A{
void a(){
System.out.println("child'a()");
}
}
public static void main(String[] agrs){
AA aa = new AA();
aa.a();
A a = (A)aa;
a.a();
}
這兩種打印出來的結果都是一樣的,怎么才能調用A中的a方法,在不改變 A 和AA的方法的情況下。
answer:
子類調用父類中被重寫的方法,用super.被重寫的方法()即可!
這個是java和c++一個很重要的區別,在c++中,可以通過這樣向上提升的類型操作實現對父類行為的調用,而在Java中,無論對其進行什么樣的類型轉換,其類型實際上是不變的。
舉個簡單的例子,C++中
輸出的結果是 Class A Class A 1A 說明通過類型提升b對象類型已經變成A類型。因此調用A中的行為,自然顯現的是A的行為。 但是這個在java中確實相反,請看以下代碼:
執行該代碼 Agg agg = new Agg(); Base base = new Agg(); if(base instanceof Agg) System.out.println("Class Agg"); else System.out.println("Class Base"); System.out.println(base.getFields()); System.out.println(agg.getSuperFiedls()); 結果 Class Agg AGG Base 由此可將,無論將Java中的對象如何進行類型提升,依然保持其原有的類型。 今天也是碰到這問題好好總結了一下,希望能夠對看到的人有所幫助。 |
||||
|