这是我的问题
class A{
private B b = new B(this); // line 2
A(){}
}
这只是前任。代码和工作正常。但我怀疑this
是否用于当前参考(A 的实例)。类初始化发生在获取类实例之前。那么我们怎样才能放入this
第 2 行。我问实例化是否在初始化之前发生?
这是我的问题
class A{
private B b = new B(this); // line 2
A(){}
}
这只是前任。代码和工作正常。但我怀疑this
是否用于当前参考(A 的实例)。类初始化发生在获取类实例之前。那么我们怎样才能放入this
第 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 的引用存在使用未完全初始化的对象的真正风险。
当心。
这不是类初始化(尝试new ClassA()
一步步调试),实际上是实例初始化。
如果构造函数 (from ClassB
) 调用一些函数 from ,可能会出现一些问题,这些函数访问其中的一些未初始化的ClassA
字段。ClassA
编辑:这是在调用构造函数之前完成的。
this
当您创建类 A 的对象时,将显示它的存在。实例变量在对象创建后分配,静态变量在类加载时以及在创建任何对象之前初始化。您不能在静态块中使用上述初始化
static {
private B b = new B(this); // compiler error. you cannot use 'this' in static context.
}
this
正确使用。构造函数根本不需要调用。
不需要改变,一切都很好。this
是对 A 的有效引用。