0

这是我的问题

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

  A(){}
}

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

4

5 回答 5

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 的引用存在使用未完全初始化的对象的真正风险。

当心。

于 2013-03-09T17:28:19.810 回答
1

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

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

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

于 2013-03-09T17:08:26.767 回答
0

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

static {
    private B b = new B(this); // compiler error. you cannot use 'this' in static context.
}
于 2013-03-09T17:04:38.550 回答
0

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

于 2013-03-09T17:04:59.457 回答
0

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

于 2013-03-09T17:05:08.353 回答