为什么类的子类必须是静态的才能在类的构造函数中初始化子类?

Ale*_*lex 13 java constructor

所以,问题或多或少都像我写的那样.我知道它可能根本不清楚所以我会举一个例子.

我有类Tree,其中有Node类,而Tree的空构造函数是:

public class RBTree {
    private RBNode head;

    public RBTree(RBNode head,RBTree leftT,RBTree rightT){
        this.head=head;
        this.head.leftT.head.father = head;
        this.head.rightT.head.father = head;
    }

    public RBTree(RBNode head){
        this(head,new RBTree(),new RBTree());
    }

    public RBTree(){
        this(new RBNode(),null,null);
    }  

    public class RBNode{
        private int value;
        private boolean isBlack;
        private RBNode father;
        private RBTree leftT;
        private RBTree rightT;
    }
}
Run Code Online (Sandbox Code Playgroud)

Eclipse给出了错误:"由于一些中间构造函数调用,没有封闭的RBTree实例可用于"空构造函数中的"新RBTree()".但是,如果我将RBNode更改为静态类,则没有问题.

那么为什么当类是静态的时它才起作用.

顺便说一下,我找到了一个简单的解决方案:

public RBTree(){
    this.head = new RBNode();
}
Run Code Online (Sandbox Code Playgroud)

所以,我不知道第一段代码中的问题是什么.

Yis*_*hai 24

基本上,内部类(没有静态修饰符)具有对其外部类的实例的隐式引用,因此在创建外部类之前不能创建它.通过在调用this它时创建一个不能引用外部类,因为在调用super之前,外部类根本没有构造太多.适用于你的情况,head的赋值发生在对super的(隐式)调用之后,所以类的构造足以获得对它的引用.

所有这些规则都会阻止您通过引用未初始化的对象并让Bad Things(TM)发生而将自己射入脚中.

  • 这种限制使我无法编写干净的代码.我必须发明丑陋的变通方法.尽管如此,即使有这个限制,我仍然可以访问未初始化的变量.在编写丑陋的代码时,它更容易.因此,为了防止我们"射入自己的脚",必须在JLS中禁止java.创建内部实例没有任何问题.Inner可以引用封闭,因为对象已经存在.它未初始化的事实并没有错.否则,您可能会认为在初始化对象之前初始化对象是危险的. (2认同)