我收到了这个例外。

Exception in thread "main" java.lang.StackOverflowError
at java.util.AbstractCollection.<init>(AbstractCollection.java:66)
at java.util.AbstractList.<init>(AbstractList.java:76)
at java.util.ArrayList.<init>(ArrayList.java:151)


这是否意味着一个类不能包含其自身的对象作为变量?但是在链表实现中,节点可以包含指向自身的节点吗?

public class Test {

String name;
List<Test> related;

public Test() {

    name = "dog";
    related = new ArrayList<Test>();
    related.add(new Test());
    related.add(new Test());
    related.add(new Test());
}

public List<Test> relate() {

    return related;
}

public String toString() {
    return name;
}

public static void main(String[] args) {

    Test test = new Test();
    for(Test t : test.relate()) {
        System.out.println(t);
    }
}
}

最佳答案

您可以通过在构造函数中添加一个参数来解决问题,该参数指定要添加的元素数量,这表明问题是代码中的无限递归,而不是在构造函数中创建新实例所固有的问题:

import java.util.ArrayList;
import java.util.List;

public class Test {

  String name;
  List<Test> related;

  public Test(int numberToAdd) {

    name = "dog";
    related = new ArrayList<Test>();
    for (int i = 0; i < numberToAdd; i++) {
      related.add(new Test(0));
    }
  }

  public List<Test> relate() {

    return related;
  }

  public String toString() {
    return name;
  }

  public static void main(String[] args) {

    Test test = new Test(3);
    for (Test t : test.relate()) {
      System.out.println(t);
    }
  }
}

10-07 23:50