我只是在另一个问题中看到了这段奇怪的代码。我以为这会导致抛出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
引用了它自己来构建。
我不明白为什么不是这样。
发布于 2017-01-30 17:39:32
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
结尾的无限构造函数调用链。
https://stackoverflow.com/questions/41932668
复制相似问题