2011-05-19 193 views
1

爲什麼在調用默認構造函數時未調用默認構造函數(相同類),但父類的默認構造函數正在調用 - 爲什麼?默認構造函數未調用

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

class B extends A{ 
    B(){ 
     System.out.println("B()"); 
    } 
} 

class C extends B{ 
    C(){ 
     System.out.println("C()"); 
    } 
    C(int i){ 
     System.out.println("<------>"+i); 
    } 
} 
public class sample { 
    public static void main(String[] args) { 
     C c = new C(8); 

    } 
} 

輸出:

A() 
B() 
<------>8 
+3

從技術上講,這不是默認構造函數。在Java中,如果源中沒有構造函數,則會提供合成的默認構造函數。具有零參數的構造函數被稱爲* no-args *構造函數。這與C++的不同之處在於,在各種情況下默認調用默認構造函數。 (Java語言中唯一一個無參數構造函數將被隱式調用的情況是,子類構造函數不顯式調用「this(...)」或「super(...)」。) – 2011-05-19 13:12:38

回答

4

這是Java的規則。如果你想要你的行爲,你必須使用this()作爲C(int)中的第一條指令。

4

如說這是之前的Java標準的行爲,如果你想一些代碼來一直呼籲建設一個對象,你可以使用基於類聲明類「C」的初始

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

    } 
} 
4

,你被超載的構造,因此,當你創建一個新的「C」對象,並在整數關口用下面的代碼:

C c = new C(8); 

要調用構造函數

C(int i){ 
    System.out.println("<------>"+i); 
} 

代替構造

C(){ 
    System.out.println("C()"); 
} 

因此它不會打印出 「C()」。重載構造函數/函數取決於傳入參數的類型和數量。最重要的是,只有1個構造函數被調用,用於創建每個對象。