class AP{ public AP() { g();//這裏到底會調用哪一個函數呢》是父類AP的,仍是子類A } public void f() { System.out.println("AP f()"); } public void g() { System.out.println("AP g()"); } } public class A extends AP{ @Override public void f() { System.out.println("A f()"); } @Override public void g() { System.out.println("A g()"); } public static void main(String[] args) { AP instance = new A(); instance.f(); instance.g(); } }
這個的輸出結果爲:java
A g() A f() A g()
結果分析: 運行結果告訴咱們,在建立子類時,同時也會調用父類的構造函數, 但,當咱們在構造函數 public AP()中調用g()時,代碼運行的是 子類中覆蓋的g()方法。 原理: 這個是因爲java的動態綁定機制致使的,(綁定指的是講一個方法調用和一個方法主體鏈接 到一塊兒),就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象 方法。由於此時內存中存在的對象爲 A class,因此在AP() {g();} 這裏調用的g()方法 實體爲 @Override public void g() { System.out.println("A g()"); }
補充:程序員
只有類中的方法纔有多態的概念,類中的成員沒有,下面舉個例子
class AP{ public String string = "AP"; } public class A extends AP{ public String string = "A"; public static void main(String[] args) { AP instance = new A(); System.out.println(instance.string); } }
這段代碼的輸出結果爲:面試
AP//而不是 A
參考資料:《Java程序員面試筆試》
ide