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