实例化对象时的无限递归

时间:2012-11-18 22:47:52

标签: oop recursion

我有两个班,A班和B班。

A类有一个对象Class B的ArrayList。

每个B类对象都有一个存储A类对象的属性。

因此,当我创建一个Class A对象时,它会填充对象Class B的ArrayList。每个对象Class B创建一个对象Class A(与正在填充的对象相同),它创建一个对象Class B的ArrayList。 ..等等。

我该怎么做才能避免这种无限递归?

2 个答案:

答案 0 :(得分:1)

这应该可以修复无限递归:(Java假设)

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;
  }
}

请注意,B的{​​{1}}字段未使用attribute分配,而是通过引用new。通过不使用A,我们不会创建new类的新实例并避免递归。

答案 1 :(得分:0)

我认为,你误解了类(作为类型)和对象之间的区别。

...So when I create a Class A object, it populates the ArrayList of objects Class B. Each object Class B creates an object Class A (same as the one that is being populated)...   - 不精确same作为对象,但与类相同。每个对象B都存储类A的对象。 一旦创建了对象A,可能就不像A->B->A那样对象。

但是如果你想从对象A引用父对象B,你可以使用引用(例如。你想使用它的公共方法等)。因此,在这种情况下,您不能在A中创建对象B的新实体,但是,当您创建对象B时 - 在B的构造函数中,您必须使用as对父对象A的参数引用。

在C ++中,这个技巧很常见。