我想了解為什么以下代碼的結果是:
public class Base {
private int member1 = 1;
private int member2 = 2;
public Base() {
System.out.println("base ctor")。
print()。
}
public void print() {
System.out.println(member1 ""/span> member2)。
}
}
class Derived extends Base {
private int member3 = 3;
private int member4 = 4;
public Derived() {
System.out.println("derived ctor")。
print()。
}
public void print() {
System.out.println(member3 ""/span> member4)。
}
}
class Test{
public static void main(String[] args){
Derived d = new Derived()。
}
是:
base ctor
00
派生ctor
34
派生類的建構式隱含地呼叫其超類
建構式。super的(基類)建構式列印 "base ctor"
super的建構式呼叫print() - 它列印了member 1 , member 2。
我以為member1和member2已經初始化了,因為我認為我知道,當我們創建一個物件時,事情的順序是
靜態欄位& 塊先進行(如果它是該類的第一次加載
然后實體事物(如欄位&成員)按順序進行,這意味著在代碼的順序中什么在前。
這里--欄位在建構式之前,這意味著它應該運行并在達到列印之前已經初始化了成員1和成員2。
為什么會列印0 0?
它到底是去列印Base還是去列印Derived?因為它是從Base的建構式中呼叫的,所以我不明白。
謝謝你。
uj5u.com熱心網友回復:
你在Derived中呼叫了print方法兩次--一次在Base建構式中,一次在Derived建構式中。這是因為Derived.print()覆寫了Base.print()。
所以這個期望:
super的建構式呼叫print()- 它列印了member 1,member 2
...是不正確的。它是在呼叫Derived中的print()實作,它列印了member3和member4。這些還沒有被初始化。
執行的順序是
執行的順序是:
- 基類欄位初始化
- 基類欄位初始化器
- 基類構造體
- 基類欄位初始化器
- 派生類欄位初始化器
- 派生類構造體
- 派生類建構式體
如果你只是把你的兩個print方法改為print1和print2(并適當改變呼叫代碼),那么它就會列印:
base ctor
12
派生ctor
34
......如你所料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/333052.html
標籤:
