这是我的问题
class A{
private B b = new B(this); // line 2
A(){}
}
这只是一个前任。代码和工作正常。但我怀疑this
是否用于当前参考(A的实例)。类初始化发生在获取类实例之前。那么我们怎样才能将this
放在第2行。我问在初始化之前是否发生了实例化?
答案 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的有效引用。