簡體   English   中英

為什么子類構造函數不覆蓋?

[英]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()

?

OakTree的一種,因此必須先構建 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.

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