何时在构造函数外部进行初始化?

时间:2012-08-04 17:47:46

标签: java constructor

假设我有

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需要哪个值?

这不会给我带来任何问题,但我只想更好地理解语言。我想知道这些小事情,以便我以后可以使用它们。

2 个答案:

答案 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