gpt4 book ai didi

java - 为什么这个语句不抛出 StackOverflowError?

转载 作者:IT老高 更新时间:2023-10-28 11:51:59 29 4
gpt4 key购买 nike

我刚刚在另一个问题中看到了这段奇怪的代码。我认为这会导致 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com