【问题标题】:Why does a sub-class class of a class have to be static in order to initialize the sub-class in the constructor of the class?为什么类的子类类必须是静态的才能在类的构造函数中初始化子类?
【发布时间】:2010-04-29 21:58:47
【问题描述】:

所以,问题或多或少就像我写的那样。 我知道这可能根本不清楚,所以我举个例子。

我有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改成静态类,就没有问题了。

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

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

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

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

【问题讨论】:

    标签: java constructor


    【解决方案1】:

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

    所有这些规则都可以防止您通过引用未初始化的对象和发生坏事 (TM) 来击中自己的脚。

    【讨论】:

    • 这个限制使我无法编写干净的代码。我必须发明丑陋的解决方法。尽管如此,即使有这个限制,我仍然可以访问未初始化的变量。编写丑陋的代码时更容易。所以,为了防止我们“射到自己的脚”,JLS中必须禁止java。创建内部实例没有错。内部可能有对封闭的引用,因为对象已经存在。它没有被初始化的事实并没有使它出错。否则,您可能会认为在对象初始化之前对其进行初始化是危险的。
    【解决方案2】:

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

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2015-03-30
      • 2016-03-26
      • 2019-01-21
      相关资源
      最近更新 更多