2014-09-28 190 views
-2

我在Java中很新,並且會提出一個基本問題。希望你們能幫助我。假設我有一個基地CLASSE超級和派生類子,其從類超級遺產如下:派生類的構造函數(Java)

public class TestSuperSub { 
    public static void main(String[] args) { 
    Super ou = new Sub(5,10); 
    } 
} 

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

    Super(int x, int y) { 
    System.out.println("Super(int, int)"); 
    } 
} 

class Sub extends Super { 
    public Sub(int x, int y) { 
     System.out.println("Sub(int, int)"); 
    } 
} 

輸出是

Super() 
Sub(int, int) 

我明白,該OU調用子::子(INT ,int),因此打印出Sub(int,int)。但是爲什麼Super()打印出來,因爲Super :: Super()並沒有被調用?

有人可以請解釋給我。 非常感謝! Cheers

+0

如果這個問題解決了,請選擇一個答案來標記爲已接受(綠色複選標記),您也可以upvote有用的答案。 – user1803551 2014-09-29 18:25:48

回答

1

默認情況下,Java將調用超級類別的無參數構造函數,除非您明確調用另一個構造函數。如果你想打電話給Super(int, int),必須顯式調用它:

+0

謝謝!我現在得到它;-) – user3729545 2014-09-28 18:18:50

0

當你實例化一個類,所有的超類層次也必須被實例化,它會如此通過自動提供每一類的空構造函數來完成。

下面的代碼

public class Superclassing { 

    public static void main(String[] args) { 

     new C(); 
    } 

    Superclassing() { System.out.println("super"); } 
} 

class A extends Superclassing { 

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

class B extends A { 

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

class C extends B { 

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

輸出

super 
A 
B 
C 

正是因爲在飛碟雙向的答案這裏提到並且還通過設計這樣做了(奇怪的是,它是之前在8.8.7解釋提及):

JLS 8.8.3. Constructor Modifiers

缺乏本地構造是任意語言的設計選擇 ,可以很容易的Java虛擬機 的實現,以驗證超構造始終正確對象創建期間調用 。

(重點煤礦。)

+0

謝謝;-)我現在明白了 – user3729545 2014-09-28 17:43:15

0

但是爲什麼超()打印出來,因爲超級::超()尚未從未叫什麼名字?

它,因爲你的Sub構造函數是隱含調用它。這是因爲如果你寫:

public Sub(int x, int y) { 
    super(); 
    System.out.println("Sub(int, int)"); 
} 

section 8.8.7 of the JLS

一個構造體的第一個語句可以是相同的類或直接超類的另一個構造函數(§的顯式調用8.8.7.1)。

...

構造函數通過一系列一個或多個顯式構造函數調用來直接或間接地調用自身,這是編譯時錯誤。

如果構造函數體沒有以顯式構造函數調用開始,並且聲明的構造函數不是原始類Object的一部分,則構造函數體隱式地以超類構造函數調用「​​」開始,構造函數的調用它的直接超類沒有任何爭論。

如果你想調用一個不同的超類構造函數,你需要隱式地做。當你調用一個子類的構造函數時,總是通過繼承層次結構繼續工作,在子類構造函數之前執行超類構造函數的主體......實際上,即使子類中的字段初始值設定項只在超類構造函數。

+0

謝謝你的詳細解釋 – user3729545 2014-09-28 17:38:27

0

通過在子類 第一線的構造函數默認是調用基類的默認構造函數(隱含的),如果沒有構造中提到,是**

超();

** 如果你寫

超(X,Y);

那麼其他的構造函數將被調用

注:構造函數的第一行是調用基類構造函數。 如果沒有超類,那麼對象類的構造函數被調用

0
class A{ 
A(){ 
    System.out.println("no-arg constructor in A"); 
} 

A(int a){ 
    System.out.println("parameterized constructor in A"); 
} 
} 

class B extends A{ 
B(){ 

    System.out.println("no-arg constructor in B"); 
} 

B(int b){ 
      //by default during compilation super() keyword will be added in first line of this constructor 
    System.out.println("paramterized constructor in B"); 
} 

} 
public class TestDemo { 
public static void main(String[] args) { 
    B aVar = new B(10); 
    aVar = new B(); 

} 

} 

Output: 
    // output for first object i.e, new B(10) 
    no-arg constructor in A 
    paramterized constructor in B 
    //output for second object i.e, new B() 
    no-arg constructor in A 
    no-arg constructor in B 

阿超()的關鍵字將被默認的編譯器在編譯期間取決於ü在main方法創建對象添加。

相關問題