2013-01-10 67 views
0

在下面的代碼片段中,我明白子類中的super(t)顯式調用其超類(B類)中的無參數構造函數。我似乎有理解的問題是爲什麼子類必須調用超類中的無參數構造函數?我似乎無法解決這個問題的目的?爲什麼子類必須在超類中調用no args構造函數?

public class Test { 

    public static void main(String[] args) { 

     B b = new B(5); 

    } 
} 
class A extends B { 
    public A(int t) { 
     super(t); 
     System.out.println("A's constructor is invoked"); 
    } 
} 

class B { 



    public B(int k) { 
    System.out.println("B's constructor is invoked"); 
    } 
} 
+0

只需在'B'中實現一個無參數構造函數,並將其打印到屏幕上。你會注意到,它不會被調用(在你的例子中)。 –

回答

1

超級(T)在子類中被明確援引在其超類(類B)一個無參數構造。

不,super(t)可以改寫爲B(t)。它調用你在代碼中顯示的構造函數。

我相信你所想的是

如果構造函數沒有明確調用父類的構造函數,Java編譯器會自動插入到超類的無參構造函數的調用。

http://docs.oracle.com/javase/tutorial/java/IandI/super.html

即如果代碼沒有做super(t)默認的無參數的構造函數被調用,但是

如果超類沒有無參數的構造函數,你會得到一個編譯時錯誤

+0

所以super(t)實際上是在類B中傳遞一個int值給public B(int k)? –

+0

@JohnW yes –

3

超級必須實例化之前像子parent must exists before child

我明白超(T)在子類中的>超明確調用一個無參數的構造函數(B類)

super(t)實際上super(5)將調用public B(int k)
super()嘗試調用不存在的public B()

注意:如果類中沒有可用的構造函數,編譯器將提供no-arg構造函數。

+0

非常好的解釋:) – Deepak

+0

所以super(t)實際上是在類B中傳遞一個int值給public B(int k)? –

+0

是的,它是...... –

1

您的班級B沒有無參數構造函數(沒有參數)。如果有,它將由A的構造函數自動調用。但在該示例中,您必須使用super(t)手動調用它以指定應該使用的參數。

+0

它只會被A的構造函數調用,不會顯式調用超類的構造函數。 –

+0

所以super(t)實際上是在類B中傳遞一個int值給public B(int k)? –

+0

我想了解這種關係。爲什麼在B中必須有一個沒有參數的構造函數,或者在A類中有超級(t)。爲什麼沒有這兩種方法都無法運行? –

相關問題