的所有事情很少首先要注意:
首先得到的一些想法訪問修飾符:
關於私有構造:
防止子類(E xtending)。如果你只做一個私人的構造函數(只有有一個構造函數),沒有類可以擴展你的類,因爲它不能調用構造函數super()
。 read more
而且一點關於構造函數:
- 構造函數永遠不會繼承 - 他們是特定於 類定義它們。
- 如果沒有構造函數實現,默認構造函數將隱式加入 編譯器。
- 在子類中沒有調用
super()
編譯器會自動將這些添加到所有構造函數中。
- 當構造子類的新對象時,超類的構造函數 始終首先調用。
- 構造函數的調用可能是隱式的或顯式的。
- 顯式調用超類的構造函數:
super()
- 必須是子類構造函數中的第一條語句。
沒有任何的構造函數MG
:
在這一行public class MG extends Car {
月食顯示錯誤:
Implicit super constructor Car()
is not visible for default constructor. Must define an explicit constructor.
因爲繼承的,你需要將值傳遞給父類的構造。
而對於這個new MG(7);
:
The constructor MG(int) is undefined
因爲你DONOT有任何參數的構造函數中MG
類。
UPDATE:
你說你的問題,你只需要知道行號7,11,12,13和14,但我會回答所有的線。然後,其他人誰在尋找的答案也可以理解
如果您取消註釋行號7:
當我們創建一個子類永遠是父母的構造得到完成的對象和孩子的構造稍後運行。
當您運行程序時,首先在主要方法new MG(7);
對象中尋找MG
中的匹配構造函數,即MG(int x) {}
。裏面有super()
這是編譯器加了一個。然後編譯器在父類中查找默認構造函數,因爲默認構造函數是private
,所以找不到它。
要解決這個問題:MG(int x) {super(x);}
如果您取消註釋行號8:
當你運行該程序,首先在main方法new MG(7);
對象尋找在MG
,這是找到匹配的構造。
MG(int x) {super()}
如果你添加了super()
或者編譯器不會添加這個。在這兩個之間沒有什麼不同:
MG(int x) {}
MG(int x) {super()}
如果您取消註釋行號9:
這條線是罰款(沒有錯誤)。第一個編譯器尋找構造函數(MG(int x) { super(x); }
for object(new MG(7);
))然後在構造函數裏面調用super(x)
它有一個參數並且與父類的構造函數匹配正如我前面提到的,父類構造函數先執行,然後子類構造函數執行。
如果您取消註釋行號10:
private MG(int x) { super(x); }
訪問修飾符不會受到影響,因爲這個類是一個子類,它不是任何一類的父類。我們可以通過調用private
構造函數來創建對象。 read more about private constructor。
如果您取消註釋行號11:
MG() { }
它是與之相匹配的new MG();
對象。編譯器已添加super()
,但在父類中找不到匹配的構造函數。
如果您取消註釋行號12:
MG() { this(); }
首先,讓我們看看什麼是this()
:
this
可以在方法或類的構造函數中使用。
this
作爲引用當前Object的方法或 構造函數被調用。
- 此關鍵字可用於從實例Method或構造函數中引用當前對象的任何成員。
this()
關鍵字可以在構造函數中用於調用另一個 重載的構造函數在同一個類中。
- 這也稱爲顯式構造函數調用。
- 而且
this()
和super()
都不能在一個構造函數中使用。
所以這條線是不必要的,因爲你沒有任何其他MG()
構造函數。 learn more about this
。
如果您取消註釋行號13:
MG() { this(6); }
這也是不必要的或不能被稱爲除非你有另一MG()
構造。如果你這樣做:
MG(){
this(6);
}
MG(int x){
super(x);
}
這裏發生什麼事是,當你運行程序new MG();
對象發現默認的構造函數和它調用參數的構造函數(MG(int x){}
)。然後在這個構造函數中取值併發送給父類。
如果您取消註釋行號14:
MG() { super(7); }
new MG();
與costructor匹配,並在其中你通過價值7
父類參數的構造函數。
完成。
哦,我明白了!謝謝Rijuk。我不知道super()將被稱爲 –
反正我相信我現在明白了。謝謝! –
沒問題。祝你好運與編碼:) – Rjiuk