2017-05-06 88 views
-1

的請看下面的例子:訂單字段初始化

public class Constructor 
{ 
    Constructor(int i) 
    { 
      System.out.println(i); 
    } 
} 

public class Test 
{ 

     Constructor c1 = new Constructor(1); 

     Constructor c2 = new Constructor(2); 

     public static void main(String[] args) 
     { 
      new Test(); 
     } 
} 

此輸出:

1 
2 

請解釋爲什麼發生這種情況,以及是否這種行爲是一致的。

+0

http://stackoverflow.com/questions/804589/use-of-initializers-vs-constructors-in-java –

+0

閱讀合適的手冊:http://docs.oracle.com/javase /specs/jls/se8/html/jls-12.html#jls-12.5 –

+3

真正的問題是什麼? – Adam

回答

0

靜態和實例字段的初始化程序是按照它們出現在源代碼中的順序執行的。

在您的示例中,c1聲明位於c2聲明之前,因此它將首先執行,並由您看到的輸出指示。

爲什麼?

  1. 由於JLS是這樣說的:

    「4)在執行實例初始化和實例變量初始值設定爲這樣的類,分配實例變量初始化的值,以相應的實例變量,從左至右的順序,它們以文本形式顯示在類的源代碼中。「

    (如果這樣做沒有意義的你,請參閱JLS閱讀其上下文的句子。)

  2. 因爲是有意義的這樣做的:

    • 未指定的初始化順序對代碼可移植性不利,因此任何其他順序(例如反向順序,詞法順序)都是違反直覺的。
+0

我的意思是,如果是指向「新的構造函數()」我看 –

+0

但ponit類測試「新測試()」不是類構造函數 –

+0

是的。但'Test'聲明'c1'和'c2'並使用'new Constructor(...)'初始化它們。我的答案解釋了*當新Test()時發生了什麼*。發生的是這兩個'Constructor'實例被創建。 –