為什麼super(…)或this(…)呼叫語句只能作為建構函式中的第一句出現?

634828354發表於2017-08-16
class A {
     A()
       {
            System.out.println("You call super class non-args constructor!");
    
       }
} 
class B extends A {   
   B()   
   {
      //這裡,編譯器將自動加上 super(); 
     System.out.println("You call subclass constructor!");     
  }

    B(String n)
    {     
    super(); 
    this();     
    //實際就是呼叫了B(){...},而在B(){...}中編譯器自動加上了     
    //super();這樣就相當於兩次呼叫了super();也就是說對父類進
    //行了兩次初始化。而在例項化一個物件時,一個構造方法只能呼叫一次,這說明this和super不能同時存在一個構造方法中。
    //同時因為系統沒有在第一行發現this()或super()呼叫,就會自動加上super(),如果沒有將this()和super()放在第一行就會產生矛盾。      
    //因為總有一個super()在第二句上。所以該程式不能透過編譯!!!   }

結論 也就是說你必須在構造器的第一行放置super或者this構造器,否則編譯器會自動地放一個空引數的super構造器的,其他的構造器也可以呼叫super或者this,呼叫成一個遞迴構造鏈,最後的結果是父類的構造器(可能有多級父類構造器)始終在子類的構造器之前執行,遞迴的呼叫父類構造器。無法執行當前的類的構造器。也就不能例項化任何物件,這個類就成為一個無為類。  從另外一面說,子類是從父類繼承而來,繼承了父類的屬性和方法,如果在子類中先不完成父類的成員的初始化,則子類無法使用,應為在java中不允許呼叫沒初始化的成員。在構造器中是順序執行的,也就是說必須在第一行進行父類的初始化。而super能直接完成這個功能。This()透過呼叫本類中的其他構造器也能完成這個功能。  因此,this()或者super()必須放在第一行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30046312/viewspace-2143640/,如需轉載,請註明出處,否則將追究法律責任。

相關文章