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

标签 java stack-overflow

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

相关文章:

java - 简单的 : Element 'id' is already used

java - Spring Data 弹性和递归文档映射

android - java.lang.StackOverflowError 在 android 4.0 而不是在 android 3.0

java - JButton setIcon 更新错误

java - 使用高停止条件 10000 时如何修复 StackOverflowError

java - toStrings() 的堆栈溢出错误 (java)

node.js - 如何在API导入请求期间避免 "Allocation failed - JavaScript heap out of memory"

java - Netbeans 中的 JAXB : how to get Lists instead of vectors?

java - java中的Httpclient,不使用任何第三方库

java - Java 和 Python 通过 stdout 进行通信