2017-05-28 115 views
1

我有一個代碼片段,我應該確定哪一行我應該取消註釋以便編譯。什麼行應該被取消註釋,爲什麼,繼承

問題:爲什麼只有第9,13和10,14行有效?爲什麼不會9,14工作?我有點困惑。幫助非常感謝! (順便說一句,該選項僅取消註釋兩行代碼)

1. // Question 3.1 
2. class Car { 
3. private Car() { } 
4. protected Car(int x) { } 
5. } 
6. public class MG extends Car { 
7. // MG(int x) { } 
8. // MG(int x) { super(); } 
9. // MG(int x) { super(x); } 
10. // private MG(int x) { super(x); } 
11. // MG() { } 
12. // MG() { this(); } 
13. // MG() { this(6); } 
14. // MG() { super(7); } 
15. public static void main(String[] args) { 
16. new MG(7); 
17. new MG(); 
18. } } 

相信缺乏瞭解來自私有構造的不夠熟悉和保護的訪問修飾符,所以我讀上我也將繼續嘗試搞清楚。

編輯:好吧,我現在差不多了,首先8行不能被調用,所以8和11-14的選項都消失了。第7行 - 爲什麼不能要求例如與第11行?我相信MG(){}會被調用,但首先必須調用私人車(),錯誤。與線12不可能的,因爲比我更需要線11條,與13號線不知道爲什麼,有14行不知道爲什麼..

回答

1

我在Ideone上寫過這篇文章,因爲我非常肯定第9行和第14行應該可以工作,而且它們也行!

入住在這裏(代碼)

在這個例子中需要記住的唯一重要的事情是,如果你不調用父類的構造,Java將調用它以這種方式「超()」。由於你的父類非參數構造函數是私有的,它不會被編譯。

這就是爲什麼第7,8,11行顯然是錯誤的。

+0

哦,我明白了!謝謝Rijuk。我不知道super()將被稱爲 –

+0

反正我相信我現在明白了。謝謝! –

+1

沒問題。祝你好運與編碼:) – Rjiuk

-1

的所有事情很少首先要注意:

首先得到的一些想法訪問修飾符:

enter image description here

關於私有構造:

防止子類(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父類參數的構造函數。

完成。

+0

沒有任何類是私有的。他們有私人建設者。 – Rjiuk

+0

我已經更新了答案 – Blasanka

1

繼承

子類在默認情況下得到的所有父類的方法,變量,構造函數的訪問。

當你要創建子類的對象然後(jvm隱式調用零參數構造函數)第一個父類構造函數被執行,然後是子類構造函數。

在你的情況下,你顯式調用超類的構造函數。

在構造函數中使用print語句,您將獲得清晰的想法...

+0

是的,我現在得到了Navnath。謝謝 –