abstract class A {
abstract void method();
}
class B extends A {
B() {
}
void method() {
}
}
class C extends B {
C() {
}
}
當我在main中實例化類C時,它會自動調用B(父類)的構造函數。這是正常的還是我做錯了什麼?父類構造函數在java中實例化子類時自動調用
abstract class A {
abstract void method();
}
class B extends A {
B() {
}
void method() {
}
}
class C extends B {
C() {
}
}
當我在main中實例化類C時,它會自動調用B(父類)的構造函數。這是正常的還是我做錯了什麼?父類構造函數在java中實例化子類時自動調用
沒有什麼不對,有暗示調用super
構造函數。
你還沒有編寫任何類C
的構造函數,所以默認的構造函數將由編譯器提供。
C(){
super();
}
如果提供了默認的構造函數,則會調用super()
。 在你的情況下,C extends B
所以B
構造函數被調用。
如果您沒有任何其他班的班級,那麼默認情況下它也延伸Object
班。所以Object
類的構造函數會被調用。
java中每個構造函數的第一行調用super
構造方法,即java如何工作。 你應該閱讀它。
只有當你不在這裏調用一個重載的'this()'。 –
如果構造體不明確的構造 調用和正在申報的構造開始不是 原始類對象的一部分,然後在構造函數體隱含開始 與超類構造函數調用「超級( );」,其直接超類的構造函數調用 ,它不帶任何參數。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7
當你實例化一個C會有構造函數調用C,B,A,和對象。 C必須能夠像任何直接或間接的超類一樣行事,並具有所有領域的領域。 X類構造函數的作用是使對象初始化爲X.
如果沒有聲明的構造函數,編譯器會創建一個無參數的構造函數,因此每個類都至少有一個構造函數。如果不是Object構造函數的構造函數不是以「this」或「super」構造函數調用開始的,則編譯器將其視爲以「super();」開始,即對直接超類的無參數構造函數的調用。
+1解釋構造函數鏈。 –
@PaulBellora這是構造函數重載。鏈接隱式地發生在繼承樹上(Prasad解釋過)或者使用super()(也可能會重載)。 –