[英]Inheriting a constructor in java
當我們在Java中使用繼承時,是否可以通過子類繼承超類的構造函數?
在tutorialspoint上它說:
子類從其超類繼承所有成員(字段,方法和嵌套類)。 構造函數不是成員,因此它們不會被子類繼承,但是可以從子類中調用超類的構造函數。
但是在同一教程的某處說:
如果一個類繼承了另一個類的屬性,則子類將自動獲取超類的默認構造函數。
所以我想知道子類可以繼承超類的構造函數嗎?
所以我想知道子類可以繼承超類的構造函數嗎?
構造函數不能被繼承。
繼續,我設法在tutorialspoint找到與您相關的源。
重要的是要注意,在其下面提到的部分明確地標題為“ 調用超類構造函數” ,並且指出:
如果一個類繼承了另一個類的屬性,則子類將自動獲取超類的默認構造函數。 但是,如果要調用超類的參數化構造函數,則需要使用super關鍵字,如下所示。
super(values);
簡單地說,這是要說的是,如果子類構造函數未指定要調用的超類構造函數,則編譯器將自動調用超類中的可訪問的無參數構造函數。
但是,一旦超類中存在參數化的構造函數,則必須將其作為派生類的構造函數中的第一條語句調用,否則您的程序將無法編譯。
例如
public class Super { ... }
public class Derived extends Super { ... } // good ! compiler puts in a public default constructor for you.
下面的代碼將無法編譯,您應該得到一個錯誤說明:
在Super中沒有可用的默認構造函數
public class Super {
public Super(int id) {...}
}
public class Derived extends Super {...}
這意味着您需要顯式調用Super
類的構造函數,作為Derived
類的構造函數中的第一條語句,並提供必要的參數,例如
public Derived(){ super(12);}
您可以使用super關鍵字訪問超類構造函數。
您需要在子類中定義構造函數,然后調用超級構造函數。
public class Animal {
private String name;
public Animal(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void play(){
System.out.println(this.getName() + " is playing ");
}
}
public class Dog extends Animal{
public Dog(String name) {
super(name);
}
}
public class Test {
public static void main(String[] args) {
Dog d = new Dog("Winky");
d.play();
}
}
默認情況下,所有超類構造函數都是繼承的,您可以使用子類構造函數調用這些構造函數。
當實例化子類對象時,子類構造函數之前的子類期望它將執行超類構造函數,然后它將繼續執行子類構造函數。 如果您想使用默認超級構造函數以外的其他超級構造函數,則可以從子類構造函數中使用super關鍵字進行調用,並且此調用應該是子類構造函數中的第一條語句。
例:
public Subclass(String msg) {
super(msg); // calling non default super class constructor
// any other initialization
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.