成员使用“this”初始化

时间:2013-03-09 17:01:13

标签: java

这是我的问题

class A{
  private B b = new B(this); // line 2

  A(){}
}

这只是一个前任。代码和工作正常。但我怀疑this是否用于当前参考(A的实例)。类初始化发生在获取类实例之前。那么我们怎样才能将this放在第2行。我问在初始化之前是否发生了实例化?

5 个答案:

答案 0 :(得分:2)

你提出了一个有趣的观点。这是一个人为的教学示例,演示了使用示例时可能发生的运行时问题。

class A {
    private boolean isInitialized = false;
    private final B b             = new B(this);
    public A() {
        initialize();
    }
    private void initialize() {
        isInitialized = true;
    }
    public boolean isInitialize() {
        return isInitialized;
    }
    public B getB() {
        return b;
    }
}

class B {
    private boolean isInitialized = false;
    final private A a;
    public B(final A a) {
        this.a = a;
        initialize();
        System.out.println("inB:          a.isInitialize()=" + a.isInitialize());
    }
    private void initialize() {
        isInitialized = true;
    }
    public boolean isInitialize() {
        return isInitialized;
    }
}

public static void main(final String[] args) {
    final A a = new A();
    System.out.println("inMain:       a.isInitialize()=" + a.isInitialize());
    System.out.println("inMain:a.getB().isInitialize()=" + a.getB().isInitialize());
}

输出:

inB:          a.isInitialize()=false
inMain:       a.isInitialize()=true
inMain:a.getB().isInitialize()=true

在B类中使用传递给A类的引用会冒使用未完全初始化的对象的真正风险。

小心。

答案 1 :(得分:1)

这不是类初始化(尝试逐步调试new ClassA()),它实际上是实例初始化。

如果构造函数(来自ClassB)调用ClassA中的某些函数,可能会出现一些问题,这些函数会访问ClassA中未初始化的某些字段。

编辑:这是在调用构造函数之前完成的。

答案 2 :(得分:0)

this将在您创建类A的对象时显示它的存在。实例变量在对象创建后分配,静态变量在类加载时以及在创建任何对象之前初始化。 你不能在静态块中使用上面的初始化

static {
    private B b = new B(this); // compiler error. you cannot use 'this' in static context.
}

答案 3 :(得分:0)

this使用正确。根本不需要调用构造函数。

答案 4 :(得分:0)

无需改变,一切都很好。 this是对A的有效引用。