我刚刚在另一个问题中看到了这段奇怪的代码。我认为这会导致 StackOverflowError
被抛出,但它没有......
public class Node {
private Object one;
private Object two;
public static Node NIL = new Node(Node.NIL, Node.NIL);
public Node(Object one, Object two) {
this.one = one;
this.two = two;
}
}
我以为它会抛出一个异常,因为 Node.NIL
引用自身来构建。
我不知道为什么它没有。
最佳答案
NIL
是一个静态变量。它在类初始化时被初始化一次。初始化时,会创建一个 Node
实例。该 Node
的创建不会触发任何其他 Node
实例的创建,因此没有无限的调用链。将 Node.NIL
传递给构造函数调用与传递 null
的效果相同,因为调用构造函数时 Node.NIL
尚未初始化.因此 public static Node NIL = new Node(Node.NIL, Node.NIL);
与 public static Node NIL = new Node(null, null);
相同。
另一方面,如果 NIL
是一个实例变量(并且没有作为参数传递给 Node
构造函数,因为编译器会阻止你在这种情况下将其传递给构造函数),每次创建 Node
的实例时都会对其进行初始化,这将创建一个新的 Node
实例,该实例的创建将初始化另一个 NIL
实例变量,导致无限的构造函数调用链,最终以 StackOverflowError
结束。
关于java - 为什么这个语句不抛出 StackOverflowError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41932668/