创建子类时出现 StackOverflowError

StackOverflowError when making a subclass

我的超类:

public class Node {
    public MyPoint myPoint = new MyPoint();
}

我的空子类:

public class MyPoint extends Node {

}

下面的问题与我能找到的问题最接近,但是在这种情况下,我的子类是空的,没有构造函数。

我收到以下错误:

Exception in thread "JavaFX Application Thread" java.lang.WhosebugError
...
at engine.MyPoint.<init>(MyPoint.java:3)
at engine.Node.<init>(Node.java:28)
at engine.MyPoint.<init>(MyPoint.java:3)
at engine.Node.<init>(Node.java:28)
at engine.MyPoint.<init>(MyPoint.java:3)
at engine.Node.<init>(Node.java:28)
...

我不明白为什么以及如何没有递归,正如我所看到的那样。 这个怎么样

public MyPoint myPoint = new MyPoint();

与此不同(例如在 JavaFX 中),创建新组时不会出现错误?

public Group group = new Group();

MyPoint 扩展了 Node,因此当您创建 MyPoint 的实例时,您首先必须初始化其父级 Node。这意味着初始化 myPiont 成员,依此类推,直到获得 WhosebugError.

这里没有足够的上下文来建议更改,但你可能会失去这个成员。

如果您的节点 class 绝对需要 MyPoint 字段,您有几个选择:

  • 您完全确定 MyPoint 需要从 Node 扩展吗?它实际上是节点生物吗?如果没有,摆脱这个,问题就解决了。如果是这样,那么还有其他修复....
  • MyPoint 不是对每个 Node 实例都是唯一的吗?如果不是,将其设为静态字段,问题就解决了。我怀疑是这样,导致我们...
  • 如果MyPoint绝对需要从Node扩展,需要对每个Node实例都是唯一的,那么你必须传入引用,意思是改变这个:

public class Node {
    public MyPoint myPoint = new MyPoint();
}

对此:

public class Node {
    public MyPoint myPoint;  // note that MyPoint NOT created here

    public Node(MyPoint myPoint) {
        this.myPoint = myPoint; // but rather passed in HERE
    }
}   

这样您就不会在每次创建 Node 时都递归创建 Node 对象,而是将 MyPoint 实例的创建与 Node 实例分开。或者,这也可以使用 setter 方法解决。