4

假设我有

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

这不会给我带来任何问题,但我只是想更好地理解这门语言。我喜欢了解这些小东西,以便我以后可以利用它们。

4

2 回答 2

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

  • 首先调用超类构造函数。如果超类构造函数调用在此类中重写的任何虚方法,则重写将看到默认值,而不管构造函数主体中的任何变量初始化器或初始化。

  • 然后执行变量初始化器。

  • 然后执行构造函数体。

因此,如果您在构造函数主体中更改变量的值,则变量初始化器设置的任何值都将被覆盖。(当然,先前的值可能已用于其他链式构造函数等。)

有关详细信息,请参阅JLS 的第 12.5 节。

于 2012-08-04T17:50:22.660 回答
1

如果要确认行为,请使用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."<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
于 2012-08-04T17:59:47.320 回答