当前位置: 首页 > 面试题库 >

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

燕文昌
2023-03-14
问题内容

因此,问题或多或少是我写的。我知道可能还不清楚,所以我举一个例子。

我有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的(隐式)调用之后,因此该类的构造足以获取对其的引用。

所有这些规则都可以防止您通过引用未初始化的对象并发生不良事件(TM)来使自己陷入困境。



 类似资料:
  • 这是一个关于java中子类的非常基本的问题,我还是不明白…… 假设我有一个超类,它有三个字段,并且只有默认的构造函数: 我想添加一个字段x。我无法更改,所以我创建了一个子类: 我现在想从现有的对象生成object: 这样我仍然可以访问,等。 如果不在子类的构造函数中“手动”分配所有这些字段,我如何才能最好地做到这一点?

  • 我在网上看到了下面的代码,并且子类构造函数在初始化它自己的变量(即)之前调用了超类构造函数,在我更改初始化顺序之后,即通过将放在之前,我的IDE会显示错误消息。我只是想知道在子类可以初始化它自己的变量之前调用超类构造函数的原因是什么?控制超类和子类初始化的一些规则是什么?

  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 子类被迫显式调用基类的构造函数似乎没有意义。如果用户可以创建自己的构造函数,而不局限于基类,将会更加灵活。有谁能告诉我为什么JAVA里要强制这种行为?这有什么好处呢?

  • 问题内容: 给定以下类别: 我的目标不是像“因为在JLS中这样指定”这样的答案。我知道是的,因为JLS是12.4.1发生初始化时,其读取内容仅为: 类或接口类型T将在以下任何一种首次出现之前立即初始化: … T是一个类,并调用T声明的静态方法。 … 我对没有这样的句子是否有充分的理由感兴趣: T是S的子类,并且在T上调用S声明的静态方法。 问题答案: 我认为这与jvm规范的这一部分有关: 每个框架

  • 问题内容: 我有两个类,和,扩展了前一个类。 具有以下构造函数: 我将注意到所有实例变量都已设置为private。 同时,具有以下构造函数: 但是,这为我的构造函数引发了“找不到符号”错误。 我尝试使用,但是我的超类的私有范围阻止了这种情况。 我发现向我的构造函数中添加字段并允许我调用超级构造函数,但是我想知道是否存在一种无需在子类构造函数中传递其所有参数的情况下调用超级构造函数的方法? 问题答案