[英]Why is the super keyword in Java not referring to the super class?
[英]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.