gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:52 24 4
gpt4 key购买 nike

所以,问题和我写的差不多。我知道这可能根本不清楚,所以我举个例子。

我有 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;
}
}

Eclipse 给我错误:对于空构造函数中的“new RBTree()”,“由于某些中间构造函数调用,没有可用的 RBTree 类型的封闭实例”。但是,如果我将 RBNode 更改为静态类,则没有问题。

那么为什么当类是静态的时候它还能工作。

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

public RBTree(){
this.head = new RBNode();
}

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

最佳答案

基本上,一个内部类(没有 static 修饰符)有一个对其外部类实例的隐式引用,因此在创建外部类之前不能创建它。通过在调用 this 时创建一个,它还不能引用外部类,因为外部类在调用 super 之前根本没有构造太多。适合您的情况是,对 head 的赋值发生在对 super 的(隐式)调用之后,因此该类的构造足以获取对它的引用。

所有这些规则都可以防止您通过引用未初始化的对象和发生 Bad Things (TM) 而搬起石头砸自己的脚。

关于java - 为什么一个类的子类类必须是静态的才能在类的构造函数中初始化子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2741066/

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