考慮下面的代碼塊我想知道爲什麼和怎麼樣,強調如何,在子類中的方法打印被調用:調用基類重寫的方法從父類的構造函數
class Super {
Super() {
// what happens so that Sub's method print() is invoked
print();
}
public void print() {
System.out.println("in super");
}
}
class Sub extends Super {
Sub() {
super();
}
public void print() {
System.out.println("in sub");
}
}
public class TestClass {
public static void main(String[] args) {
Super s = new Sub(); // "in sub".. not so much expected
s.print(); // "in sub".. as expected
}
}
我理解是在編譯期間,類將獲得與方法'屬於'類相關聯的V表指針vtblPtr
。 類Super
因此應參考它自己的方法print()
的實現。
Super
構造方法中如何調用Sub
中的方法print()
?這裏真的發生了什麼?
我認爲你很困惑C++和Java:在Java中沒有vtblPtr的概念。 –
我的印象是java使用虛擬表來實現多態嗎? – John
這是一個不存在的概念。每個JVM都有自己的方式。它確實如此。 HotSpot編譯器將檢測是否加載了任何子類,或者是否用子類調用代碼,然後決定是否執行虛擬調度,直接調度或甚至內聯代碼。從Java代碼或字節代碼中不可能知道它是如何在特定的時間點完成的。 –