簡體   English   中英

當baseclass有一個帶參數的構造函數時,為什么我不能創建一個無參數的子類構造函數?

[英]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");
  }
}

我用兩種方法解決你的問題: -

  1. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM