[英]Why isn't subclass constructor overriding?
我有代碼:
class Oak extends Tree {
public Oak() {
System.out.println("Oak()");
}
}
class Tree {
public Tree() {
System.out.println("Tree()");
}
}
class mainClass {
public static void main(String[] args) {
Oak a = new Oak();
}
}
為什么會打印
Tree()
Oak()
而不僅僅是
Oak()
?
Oak
是Tree
的一種,因此必須先構建 object 的Tree
部分。 因此調用默認的Tree
構造函數。 隨后, Oak
構造函數就可以運行了。
這完全等同於在Oak
構造函數中顯式調用Tree
構造函數作為第一條語句:
public Oak() {
super();
...
}
[請注意,構造函數不會“覆蓋”。]
構造函數永遠不會被繼承,也永遠不會被覆蓋。 這意味着,在創建子 class 的實例時,將始終執行父構造函數。 因此,您會收到兩條消息
派生class object 構造按基本class 子對象構造和派生ZA2F2ED4F8EBC2CBB614C21A29DC40 子對象構造的順序進行
構造函數將從根 class 以向下的順序調用到子級。 構造函數中沒有壓倒一切的概念。
構造函數不能被覆蓋; 覆蓋僅適用於非靜態、非私有方法。
關於 inheritance,您必須了解一件重要的事情。 它意味着是子類和超類之間的關系。 因此,子類的實例是其超類的實例,其中添加了特定於子類的東西。 例如,橡樹就是一棵樹。
這意味着 Oak object 的一部分是 Tree object。 創建 Oak object 時,首先創建並初始化 object 的超類部分。 這涉及調用超類的構造函數(在您的示例中為 Tree 的構造函數)。 之后,將子類部分添加到 object 中,並為此調用 Oak 的構造函數。
當您創建 object 時,您必須調用超類的構造函數。 您可以明確指定調用或不調用超類的哪個構造函數,在這種情況下調用無參數構造函數。 這就是為什么你會調用 Tree()。 如果您沒有無參數構造函數,則會出現錯誤:
class Oak extends Tree {
public Oak() {
super("Oak Tree"); //Without this line the code won't compile
System.out.println("Oak()");
}
}
class Tree {
public Tree(String name) {
System.out.println("Tree(" + name + ")");
}
}
class mainClass {
public static void main(String[] args) {
Oak a = new Oak();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.