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

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

我有类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实例可用于”空构造函数中的“新RBTree()”。 但是,如果我将RBNode更改为静态类,则没有问题。

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

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

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

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

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

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

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

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