[英]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?
所以,問題或多或少都像我寫的那樣。 我知道它可能根本不清楚所以我會舉一個例子。
我有類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();
}
所以,我不知道第一段代碼中的問題是什么。
基本上,內部類(沒有靜態修飾符)具有對其外部類的實例的隱式引用,因此在創建外部類之前不能創建它。 通過創建一個在調用this
不能引用外部類又因為外部類不構成太大可言,直到調用超之后。 適用於你的情況,head的賦值發生在對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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.