2016-11-14 81 views
0

代碼:Java:子類構造函數的super()如何參與實例流?

Parent Class: 
public class Parent { 
    int i = 10;  
    {  
     System.out.println(i); 
    } 
    public Parent(){  
     System.out.println("Parent"); 
    } 
} 

Child Class: 
public class Child extends Parent { 
    int j = 20; 
    { 
     System.out.println(j); 
    } 
    public Child() { 
     super(); 
    } 
} 

Test Class: 
public class ConstructorTest { 
    public static void main(String... args){ 
     Child c = new Child(); 
    } 
} 

執行流(我知道的):

  1. 實例的鑑定委員由上到下的Parent類。
  2. 實例成員在Child類中自上而下的標識。
  3. Parent類中從上到下執行實例變量賦值和實例塊。
  4. 執行Parent構造函數。
  5. Child類中從上到下執行實例變量賦值和實例塊。
  6. 執行Child構造函數。

輸出:

10 
Parent 
20 

我的問題是:在步驟6-在Child構造函數的執行,何必再使用兒童的super()的父類的構造不叫?
爲什麼輸出不是:

10 
Parent 
20 
Parent 
+0

'Parent'的構造函數被稱爲** once **,因爲您實例化了**一個**對象。沒有理由會被調用兩次。 – Spotted

+0

Utsav as @Spotted說父構造函數是作爲子對象構造的一部分被調用的。不需要被調用兩次 – alainlompo

+0

從您的步驟中,您已經提供了第6個點,這是代碼中發生的第一個調用。 1.主叫 2.有一個新的子對象創建和子構造函數調用因此super()被調用。 3.超級會調用父類,實例對象因此打印「10」。 4。父類構造函數被調用,因此「父」被打印。 5.然後打印子類實例對象「20」。 6.主呼叫結束。 希望這會澄清你的困惑。 –

回答

7

super()線已經生效在步驟4中,基本上。只是​​是隱含的,通常會被刪除。通常使用顯式的構造函數鏈爲:

  • 鏈接到一個構造在同一類
  • 提供參數的構造函數

儘管它爲孩子構造函數體的第一線位置,this()/super()語句執行之前實例初始值設定項。你應該認爲它與構造函數的其他部分有些分離。

+1

謝謝,它很有用! – Utsav

0

爲什麼要多次調用父構造函數?您正在創建只有一個孩子類的實例,這個調用父類的構造:

new Child() -> Child.super() -> Parent() 

因此字符串「父母」被寫入到控制檯只有一次。其他操作不是相應類的構造函數的一部分。

相關問題