假设我有
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 :(得分:6)
变量初始化为其类型的默认值(0,null等)
首先调用超类构造函数。如果超类构造函数调用此类中重写的任何虚方法,则覆盖将看到默认值,无论构造函数体中是否有任何变量初始值设定项或初始化。
然后执行变量初始化程序。
然后执行构造函数体。
因此,如果更改构造函数体中变量的值,则将覆盖由变量初始值设定项设置的任何值。 (当然,之前的值可能已用于其他链式构造函数等。)
有关详细信息,请参阅JLS的section 12.5。
答案 1 :(得分:1)
如果要确认行为,请使用javap或类似工具检查字节码。虽然Jon is correct,但请将规范称为第一个停靠端口。
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."<init>":()V
4: aload_0
5: new #3 // class java/lang/Object
8: dup
9: invokespecial #11 // Method java/lang/Object."<init>":()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."<init>":()V
23: putfield #15 // Field object2:Ljava/lang/Object;
26: return