首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么这个语句不抛出一个StackOverflowError呢?

为什么这个语句不抛出一个StackOverflowError呢?
EN

Stack Overflow用户
提问于 2017-01-30 17:37:50
回答 1查看 7K关注 0票数 75

我只是在另一个问题中看到了这段奇怪的代码。我以为这会导致抛出StackOverflowError,但它并没有...

代码语言:javascript
复制
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引用了它自己来构建。

我不明白为什么不是这样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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结尾的无限构造函数调用链。

票数 101
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41932668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档