2014-09-02 23 views
1

考慮以下例如。這個()在java中應該總是首先執行,如果存在?

public class H{ 
    int a; 

    public H(){ 
     a=5; 
    } 

    public H(String x){ 
     this(); 
    } 

    {a=0;} 

    public static void main(String []a){ 
     System.out.print(new H("").a); 
    } 
} 

的O/P爲5 這意味着初始化塊第一執行該(前),但根據Why do this() and super() have to be the first statement in a constructor?第一條語句應該是這樣的()。那是怎麼回事?

+0

_first statement_是什麼?引用你的來源。 – 2014-09-02 04:43:18

+0

構造函數中的第一條語句。 – sagar 2014-09-02 04:46:18

+2

初始化器在調用'super'的構造函數之後並在構造函數體的其餘部分之前運行。 – August 2014-09-02 04:47:14

回答

4

如果你知道構造函數鏈

一新的H(「」)調用你parameterized-構造有發現this()這麼叫去無參數的構造函數存在的初始化首先執行和被初始化爲零然後再你的a =5設定爲5,最後打印5

+0

請參閱http://stackoverflow.com/questions/19561332/what-is-order-of-execution-of-static-block-initialisatin-block-when-we-using-inh – Hannes 2014-09-02 05:11:26

3

JLS在這個(重點煤礦)非常具體:

只需到新創建的OBJ參考之前ECT被返回作爲結果,所指示的構造被處理使用下面的過程來初始化新的對象:

  1. 分配參數爲構造新創建的參數變量此構造函數調用。

  2. 如果此構造開始在同一類另一個構造的(§8.8.7.1)(使用this),其構造函數調用遞歸使用這些相同的五個步驟明確的構造函數調用,然後評估參數和工藝。如果構造函數的調用突然完成,則此過程由於同樣的原因突然完成;否則,繼續執行步驟5

  3. 此構造不會在同一個類的另一個構造函數的顯式構造函數調用開始(使用本)。如果此構造函數用於Object以外的類,則此構造函數將以顯式或隱式調用超類構造函數(使用super)開始。評估參數並使用這五個相同的步驟遞歸地處理該超類構造函數的調用。如果構造函數的調用突然完成,那麼出於同樣的原因,此過程會突然完成。否則,繼續步驟4

  4. 執行實例初始化和實例變量初始值設定爲這個類,分配實例變量初始化的值,以相應的實例變量,在左到右的順序在它們以文本形式出現在該類的源代碼中。如果執行這些初始化程序中的任何一個都會導致異常,則不會執行進一步的初始化程序,並且此過程突然以相同的異常完成。否則,繼續執行步驟5

  5. 執行此構造體的其餘部分。如果該執行突然完成,則此過程因相同原因突然完成。否則,此過程正常完成。

第2條中粗體文字意味着,當它執行this,它將再次調用這種構造函數的調用這五個步驟。由於您不需要參數就調用this(),它將遵循這些步驟,但不執行步驟2,因爲沒有調用this(),而是執行步驟3和4,並且在步驟4中它將執行實例初始值設定項和實例變量該類的初始化器。然後控件將返回執行無參數構造函數,該構造函數執行a = 5

相關問題