2017-05-06 83 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'实例被创建。 –