簡體   English   中英

Java子類的構造函數

[英]constructor of subclass in Java

編譯此程序時,出現錯誤-

 class Person {
    Person(int a) { }
 }
 class Employee extends Person {
    Employee(int b) { }
 }
 public class A1{
    public static void main(String[] args){ }
 }

錯誤 - 找不到構造函數 Person()。 為什么需要定義 Person() ?

創建Employee您同時創建了一個Person 為了確保Person被正確構造,編譯器在Employee構造函數中添加了對super()的隱式調用:

 class Employee extends Person {
     Employee(int id) {
         super();          // implicitly added by the compiler.
     }
 }

由於Person沒有無參數構造函數,因此失敗。

你解決它

  • 添加對 super 的顯式調用,如下所示:

     class Employee extends Person { Employee(int id) { super(id); } }
  • 或者通過向Person添加一個無參數構造函數:

     class Person { Person() { } Person(int a) { } }

通常,編譯器也會隱式添加無參數構造函數。 然而,正如 Binyamin Sharet 在評論中指出的那樣,只有在根本沒有指定構造函數的情況下才會出現這種情況。 在你的情況,你已經指定了一個人的構造,因此沒有隱式構造函數創建。

Employee的構造函數不知道如何構造超類Person 如果沒有您明確告訴它,它將默認嘗試不存在的超類的無參數構造函數。 因此錯誤。

修復方法是:

class Employee extends person {
    public Employee(int id) {
        super(id);
    }
}

Java實際上將此代碼視為:

class Person {
  Person(int nm) { }
 }
 class Employee extends Person {
    Employee(int id) {
        super();
    }
 }
 public class EmployeeTest1 {
    public static void main(String[] args){ }
 }

由於沒有 Person() 構造函數,因此失敗。 而是嘗試:

class Person {
  Person(int nm) { }
 }
 class Employee extends Person {
    Employee(int id) {
        super(id);
    }
 }
 public class EmployeeTest1 {
    public static void main(String[] args){ }
 }

Java 為您提供了一個不帶參數的默認構造函數。 構造函數也沒有主體,所以它是這樣的: public Person() {} 在您定義自己的構造函數的那一刻,您的構造函數將取代默認的構造函數,因此在您的情況下, Person(int nm){}取代Person() { } 您的調用試圖隱式調用Person() { }並且由於此構造函數不再存在,因此代碼失敗。 查看這個以前的 SO 問題以獲取更多信息。

上面的答案是正確的,還有一些補充:您可以直接調用 super(int n) 以避免在此處隱式添加 super() :

class Employee extends Person {
    Employee(int id) { super(int id);}
}
  1. 如果您不編寫構造函數,編譯器會向您的類隱式添加默認值(不帶參數)。
  2. 如果您編寫任何構造函數 - 編譯器將不會添加默認構造函數。

PS:對不起我的寫作。 英語不是我的母語。

這不是 100% 與您的問題相關。 但這也與java構造函數有關。 假設您的 Person 類沒有默認構造函數,並且構造函數參數不是原始數據類型。 它們是對象。

但是如果你想創建一個帶有默認構造函數的子類,這里是解決方案。 請記住,您不得更改超類。

我創建了另一個名為 contact 的類。

class Contact{
    private String name;
    private int number;

    public Contact(String name, int number) {
        this.name = name;
        this.number = number;
    }
}

然后這里是代碼。

//Super Class   -  "Can't change the code"
class Person {
    Person(Contact contact) { }
}

//Sub Class
class Employee extends Person {
    private static Contact c;

    static {
        c = new Contact("Anna",10);
    }

    Employee() {
        super(c);
    }
}

您必須使用 Contact 類的靜態變量來保留對象實例以傳遞給超類構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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