2017-08-12 47 views
-1

看來,如果程序員提供了構造函數,並且使用對super()的調用,則不能在該類中調用其他構造函數(即,不要超載)。這是Java固有的正常行爲嗎?爲什麼?通過調用super()重載一個包含顯式構造函數的類

abstract class Four { 
    Four () { } 
    Four (int x) { } 
    } 
class Three extends Four { 
    public Three (String name) { } 
    Three (int t, int y) { } 
    } 
class Two extends Three { 
    Two () { super ("number"); } 
// Two (int t, int y) { } //causes an error when uncommented 
    } 
class One extends Two { 
    public static void main (String [ ] args) { 
     new One (); 
     } 
    } 
+0

你能解釋一下你的問題,指出你的例子中的細節嗎? – ProgrammersBlock

+2

當超類沒有零參數構造函數時,子類構造函數必須全部明確地調用'super'。 'Three'沒有任何零參數構造函數,所以'Two'必須在其所有構造函數中調用'super'。 – 4castle

+0

@ProgrammersBlock類2中的重載構造函數在取消註釋時會導致編譯器錯誤。 @ Jon \ Skeet提供瞭解決方案。 – Michael

回答

5

沒有其他的構造可以在類(即,它不能被重載)被調用。

這根本不是真的。 Two(int t, int y)構造函數的問題在於它沒有顯式鏈接到任何構造函數,這意味着有一個隱含的super()調用 - 由於在Three 中沒有無參數構造函數而失敗。直接

  • 鏈的超級構造

    Two (int t, int y) { 
        super("number"); 
    } 
    
  • 鏈的構造在同一類

    Two (int t, int y) { 
        this(); 
    } 
    

:您可以修復有兩種方式它不一定非參數化,嚴格來說 - 如果你添加一個Three(String... values)構造函數,那沒關係。你需要有一個可以用空參數列表調用的構造函數。

相關問題