何时在构造函数外部进行初始化?

假设我有

class MyObject { Object object1 = new Object(); Object object2; public MyObject() { object2 = new Object(); } public MyObject(Object object2) { this.object2 = object2; } public MyObject(Object object1, Object object2) { this.object1 = object1; this.object2 = object2; } } 

object1何时初始化? 在object2之后,在object2之后,取决于?

如果我有一个与object1的全局定义冲突的构造函数会发生什么,例如在上面的第三个构造函数中。 object采用哪个值?

这不会给我带来任何问题,但我只想更好地理解语言。 我想知道这些小事情,以便我以后可以利用它们。

  • 变量初始化为其类型的默认值(0,null等)

  • 首先调用超类构造函数。 如果超类构造函数调用此类中重写的任何虚方法,则覆盖将看到默认值,无论构造函数体中是否有任何变量初始化器或初始化。

  • 然后执行变量初始值设定项。

  • 然后执行构造函数体。

因此,如果更改构造函数体中变量的值,则将覆盖由变量初始值设定项设置的任何值。 (当然,之前的值可能已用于其他链式构造函数等。)

有关更多详细信息,请参见JLS的12.5节 。

如果要确认行为,请使用javap或类似工具检查字节码。 虽然Jon是正确的 ,但请将规范称为第一个停靠端口。

 Compiled from "MyObject.java" class MyObject { java.lang.Object object1; java.lang.Object object2; public MyObject(); Code: 0: aload_0 1: invokespecial #11 // Method java/lang/Object."":()V 4: aload_0 5: new #3 // class java/lang/Object 8: dup 9: invokespecial #11 // Method java/lang/Object."":()V 12: putfield #13 // Field object1:Ljava/lang/Object; 15: aload_0 16: new #3 // class java/lang/Object 19: dup 20: invokespecial #11 // Method java/lang/Object."":()V 23: putfield #15 // Field object2:Ljava/lang/Object; 26: return