2014-11-24 94 views
-1
class Abc 
{ 
    public Abc() 
    { 
     System.out.println("constructor A"); 
    } 
} 

class Bb extends Abc 
{ 
    public Bb() 
    { 
     super(); // Calls Abc() 
     System.out.println("constructor B"); 
    } 
} 

public class X 
{ 
    public static void main(String args[]) 
    { 
     Bb b = new Bb(); 
    } 
} 

答案是:這段代碼的結果背後的原因是什麼?

Constructor A 
Constructor B 

誰能告訴這背後的原因是什麼?

+1

「推理」只是Java構造函數的正常行爲。例如:http://java67.blogspot.com.au/2012/12/how-constructor-chaining-works-in-java.html – 2014-11-24 08:01:09

回答

1

當一個派生類的構造函數被調用,它必須首先構建其超類。如果沒有明確地完成(通過指定super,有或沒有任何參數),它是使用無參數構造函數隱式完成的。換句話說,你的代碼就相當於:

class Abc { 
    public Abc() { 
     System.out.println("constructor A"); 
    } 
} 

class Bb extends Abc { 
    public Bb() { 
     super(); // Calls Abc() 
     System.out.println("constructor B"); 
    } 
} 

public class X { 
    public static void main(String args[]) { 
     Bb b = new Bb(); 
    } 
} 

以這種方式表達後,很容易看出爲什麼"constructor A"打印,然後"constructor B"

+0

非常感謝你解釋清楚 – Abhilash 2014-11-24 09:31:26

3

子類的構造函數(在你的情況下爲Bb)必須在執行它自己的構造函數之前調用超類的構造函數(在你的情況下爲Abc)。

此代碼:

public Bb() { 
     System.out.println("constructor B"); 
    } 

等同於:

public Bb() { 
     super(); // calls the super-class constructor 
     System.out.println("constructor B"); 
    } 
+0

如果我不想從''Abc''構造函數調用' Bb'構造函數? – Junaid 2014-11-24 07:58:50

+1

@Junaid你別無選擇。超類的某些構造函數將始終被調用,如果編譯器沒有找到,那麼您的代碼將無法編譯。 – Eran 2014-11-24 08:00:03

+1

@Junaid這是有道理的,因爲子類包含其超類的所有成員,因此它必須初始化它們(通過調用超類構造函數)。 – Eran 2014-11-24 08:01:27

0

使用super(),將調用超類無參數構造函數。使用super(參數列表),調用具有匹配參數列表的超類構造函數。

現在,如果您查看您的代碼,您將得到答案。

Refer this link for more explanation

相關問題