Oop 实例化对象时的无限递归
我有两个班,A班和B班 类A具有类B对象的ArrayList 每个B类对象都有一个存储a类对象的属性 因此,当我创建一个类a对象时,它填充对象类B的ArrayList。每个对象类B创建一个对象类a(与正在填充的对象类相同),它创建对象类B的ArrayList。。。等等Oop 实例化对象时的无限递归,oop,recursion,Oop,Recursion,我有两个班,A班和B班 类A具有类B对象的ArrayList 每个B类对象都有一个存储a类对象的属性 因此,当我创建一个类a对象时,它填充对象类B的ArrayList。每个对象类B创建一个对象类a(与正在填充的对象类相同),它创建对象类B的ArrayList。。。等等 如何避免这种无限递归?这应该修复无限递归:(假设为Java) A类{ private ArrayList list=new ArrayList(); A(){ while(某些条件){ 增加(新B(本)); } } } B类{ 私
如何避免这种无限递归?这应该修复无限递归:(假设为Java)
A类{
private ArrayList list=new ArrayList();
A(){
while(某些条件){
增加(新B(本));
}
}
}
B类{
私有属性;
B(A inRef){
属性=inRef;
}
}
请注意,
B
的属性
字段不是使用new
分配的,而是通过传递对a
的引用来分配的。通过不使用new
我们不会创建a
类的新实例并避免递归。我认为,您误解了类(as type)和对象之间的区别
…因此,当我创建一个类a对象时,它填充对象类B的ArrayList。每个对象类B创建一个对象类a(与正在填充的对象类相同)。
--与对象不完全相同,但与类相同。每个对象B
存储类A
的对象。
一旦创建了对象A
is,它可能就不是像A->B->A
那样的同一个对象了
但是,如果您希望从对象B
引用父对象A
,则可以使用引用(例如,您希望使用其公共方法等等)。因此,在这种情况下,您不能在B
中创建对象A
的新实体,但是,当您在B
的构造函数中创建对象B
时,必须将其用作父对象A
的参数引用
<>在C++中,这个技巧是相当常见的。显示如何“填充对象类B的数组列表”和“创建对象类A”将是有用的。我假设它在这些类的构造函数中完成。
Class A {
private ArrayList<B> list = new ArrayList<B>();
A(){
while(someCondition) {
list.add(new B(this));
}
}
}
Class B {
private A attribute;
B(A inRef){
attribute = inRef;
}
}