我在java中有类:A
。类B
扩展了类A
。
类A
包含类B
的实例。
我注意到当我调用类B
的构造函数时(当我在类A中初始化此参数时),它执行super(),创建A
的新实例并初始化所有字段。
如何告诉类B
类A
的具体实例(它是init it字段) - 它是他的父类?
答案 0 :(得分:2)
您的问题很难理解,但我想问题就是这个(您的方法):
public class A {
public B b = new B();
}
public class B extends A {
}
因此,当您运行new A()
时,您会获得StackOverflowError
。
根据我的实际经验,我从不需要这样的设计,我强烈建议重新考虑你的方法。但是,如果确实需要,您可以使用专用的init()
方法,例如:
public class A {
public B b;
public void init() {
b = new B();
}
}
A a = new A();
a.init();
答案 1 :(得分:1)
如果您需要B中的A,您可以使用B的自定义构造函数来执行此操作:
class B extends A {
A a;
public B() {
super();
this.a = this;
}
}
这种情况更难,但你需要:
class A {
B b;
}
class B extends A {
public B() {
super();
b = this;
}
}
请注意,您不应该将B传递给对super()的调用,因为B不会被初始化,您应该将其作为B的构造函数中的最后一步。