[英]Why can't I create a parameterless subclass constructor when the baseclass has a constructor with a parameter?
我知道以下不起作用,但你能幫我理解原因嗎?
class A {
A(int x) {
System.out.println("apel constructor A");
}
}
class B extends A {
B() {
System.out.println("apel constructor B");
}
}
public class C {
public static void main(String args[]) {
B b = new B();
}
}
您的類A
使用顯式的參數構造函數,因此默認的no-args構造函數不會隱式存在。
要讓您的B
級成功擴展A
您需要:
A
聲明的無參數顯式構造函數 super(some int)
作為B
的構造函數的第一行 考慮子類的構造函數隱式調用super()
。
每個構造函數(除了在Object
) 必須鏈接到另一個構造函數,這是它做的第一件事。 那是使用this(...)
或super(...)
。
如果沒有指定任何內容,構造函數會將super()
鏈接到超類中的無參數構造函數。 遲早,您需要遍歷繼承層次結構的每個級別的構造函數。 這基本上確保了從每個角度看對象的狀態都是有效的。
在你的情況,你不必在一個參數的構造函數A
,因此為什么B
編譯失敗。 要解決這個問題,您需要向A
添加無參數構造函數,或者明確地鏈接到B
的參數化A
構造函數:
public B() {
super(0); // Or whatever value you want to provide
}
有關詳細信息,請參閱JLS第8.8.7節 。
您必須在子類Constructor中調用超類構造函數。
B是子類,它繼承了超類A的行為。 因此,當您創建B的實例時,B的構造函數應該調用超類構造函數。
B() {
super(1); // or super()
System.out.println("apel constructor B");
}
這不起作用,因為如果類A
沒有聲明默認構造函數,則必須顯式調用超類A
構造函數之一。
它沒有編譯,因為你沒有為A定義一個默認構造函數,而構造函數正在調用它。
每次擴展一個類時,您調用的類的構造函數都將被調用(超級構造函數)。 如果聲明構造函數,它將覆蓋隱式構造函數,如果該構造函數具有參數,則從中擴展它的類將無法調用隱式構造函數,因此您必須顯式調用構造函數。
例:
B() {
super(0);//integer value
System.out.println("apel constructor B"); }
}
當你調用類'B的構造函數時,你應該聲明你希望也可以調用父構造函數
class B extends A{
B(){
super(0);
}
B(int i){
super(i);
}
}
這些構造函數中的任何一個應該沒問題
每當在Java中調用子類的構造函數時,它首先會自動調用其超類的構造函數。 始終首先執行Super類的構造函數,然后執行Sub類的構造函數。 在這種情況下,Super class Constructor在調用時需要一個整數參數,而代碼不提供該參數。 你可以試試這個:
class B extends A
{
B()
{
super(5);
System.out.println("apel constructor B");
}
}
我用兩種方法解決你的問題: -
B類擴展A {B(int x){super(x); System.out.println(“hello second constructor”);} public static void main(String args []){B b = new B(10);}} 2。
B類擴展A {B(){super(任意int值); System.out.println(“hello second constructor”);} public static void main(String args []){B b = new B(10);}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.