所以,问题或多或少都像我写的那样。 我知道它可能根本不清楚所以我会给出一个例子。
我有类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();
}
所以,我不知道第一段代码中的问题是什么。
答案 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);
}
}