簡體   English   中英

Java繼承概念引用超類構造函數?

[英]Java Inheritance Concept referring to super class constructor?

我正在做一個簡單的繼承程序,但是在做這個程序時我感到很困惑。

這是一個簡單的程序:

class Box {
    double width;
    double height;
    double depth;
    Box(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }
    //Error on removing the Box() Constructor
    Box() {
        width = -1; 
        height = -1;   
        depth = -1;  
    }

    double volume() {
        return width * height * depth;
    }
}

class BoxWeight extends Box {
    double weight,h,w,d; 

    BoxWeight(double w, double h, double d, double m) {

        // If i add super(w,h,d) here, then it is working, WHy?
        this.h = h;
        this.d = d;
        this.w = w;
        weight = m;
    }
}
class DemoBoxWeight {
    public static void main(String args[]) {
        //Implementation of above
    }
}

令我感到困惑的是,當我刪除Box()構造函數時,它給我一個錯誤,我在線上BoxWeight(double w, double h, double d, double m)構造函數。 The error is: "constructor Box in class Box cannot be applied to given types".

如果我從BoxWeight()調用super() BoxWeight() ,那么它可以正常工作。 我不明白為什么? 我知道這個概念非常簡單,但我很難理解它。 任何幫助都會得到贊賞。

你的構造函數BoxWeight(double w, double h, double d, double m)不會顯式調用超級構造函數。 這意味着調用默認構造函數Box()

如果您刪除該構造函數或使其無法從BoxWeight訪問,您將收到此錯誤。

您可以做的是顯式調用其他構造函數,如您已經發現的那樣:

BoxWeight(double w, double h, double d, double m) {

        super(w,h,d);
        this.h = h;
        this.d = d;
        this.w = w;
        weight = m;
}

只能通過調用超類上的構造函數來構造繼承的類。

當您創建子類的對象時,如果您沒有顯式調用該類的直接超類的構造函數,則隱式地,調用該直接超類的默認構造函數(並且此鏈繼續運行)繼承層次結構)。

這就是你對super(w, h, d)的調用。 您正在顯式調用Box的超類構造函數。 在這種情況下,省略對super()的隱式調用。 super()是對超類的默認構造函數的調用。 但由於您沒有包含默認構造函數,因此會導致錯誤。

但是,假設您向Box類添加了一個默認構造函數。 然后這段代碼應該可以正常工作,因為現在,對super()調用會調用超類的默認構造函數

當類沒有定義自己的構造函數時,語言會自動提供默認的隱式無參數構造函數。

當一個類定義至少一個構造函數時,該語言不提供隱式構造函數,因此該類只能使用它定義的構造函數之一進行實例化。

當派生類的構造函數不調用其超類的任何構造函數時,該語言會自動提供對super()的隱式調用。 但為了使其工作,超類必須具有(顯式或隱式)無參數構造函數。

所以,上面的代碼發生的是BoxWeight的構造函數沒有顯式調用super() ,因此語言提供了對super()的隱式調用。 這是有效的,因為Box定義了一個顯式的無參數構造函數Box()

當你刪除顯式無參數構造函數Box() ,編譯器沒有Box構造函數從BoxWeight構造函數中調用。 它不能調用剩余的構造函數,因為它接受參數,編譯器不能只決定要傳遞的參數。 正如您自己發現的那樣,如果您調用接受參數的Box的構造函數,您的代碼將再次編譯。

另外,請注意以備將來參考:“它給我一個錯誤”並不是對問題的充分描述。 它會為您提供一個非常具體的錯誤,您必須在問題中包含該錯誤。 錯誤是:“類Box中的構造函數Box不能應用於給定類型”。

刪除默認構造函數Box時,程序中實際發生的情況是編譯器沒有從BoxWeight構造函數中調用的構造函數。 這會給編譯器帶來混亂,因此會給您一個錯誤。

但是,當您提供對接受參數的Box的構造函數的調用時,您的代碼將編譯而沒有任何錯誤。

暫無
暫無

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

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