Java 何时调用构造函数外部的初始化?
如果我有Java 何时调用构造函数外部的初始化?,java,constructor,Java,Constructor,如果我有 class MyObject { Object object1 = new Object(); Object object2; public MyObject() { object2 = new Object(); } public MyObject(Object object2) { this.object2 = object2; } public MyObject(Obje
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的一部分。如果要确认行为,请使用或类似工具检查字节码。不过,请将该规范作为第一个调用端口
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
从“MyObject.java”编译而来
类MyObject{
java.lang.Object对象1;
java.lang.Object对象2;
公共对象();
代码:
0:aload_0
1:invokespecial#11//方法java/lang/Object。“:()V
4:aload_0
5:new#3//类java/lang/Object
8:dup
9:invokespecial#11//方法java/lang/Object。”“:()V
12:putfield#13//fieldobject1:Ljava/lang/Object;
15:aload_0
16:new#3//类java/lang/Object
19:dup
20:invokespecial#11//方法java/lang/Object。”“:()V
23:putfield#15//fieldobject2:Ljava/lang/Object;
26:返回
它不应该被覆盖而不是被忽略吗?@LukasKnuth:我试图理解初始化是毫无意义的,但实际上在某些情况下,它可能会有其他影响…将被编辑。