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:我试图理解初始化是毫无意义的,但实际上在某些情况下,它可能会有其他影响…将被编辑。