何时在构造函数外部进行初始化?
假设我有
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