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

时间:2010-04-29 21:58:48

标签: 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;
    }
}

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

那么为什么当这个类是静态的时它才能工作。

BTW,我找到了一个简单的解决方案:

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

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

2 个答案:

答案 0 :(得分:24)

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

所有这些规则都会阻止您通过引用未初始化的对象并发生Bad Things(TM)来拍摄自己。

答案 1 :(得分:0)

好消息!内部类的子类不必是静态的!

这是Henry Wong在代码牧场中解释的一种技术,它适用于子类内部类的外部类。它对我来说效果很好,看看语言设计师如何扭曲Java来处理极端情况总是很有趣:)

http://www.coderanch.com/t/588820/java/java/Extend-class-code-top-level#2681401

以下是示例:

class Demo extends Main.Inner{
    public Demo(Main outer) {
        outer.super();
    }

    void method(){
        System.out.println(a);
    }
}