簡體   English   中英

為什么類的子類必須是靜態的才能在類的構造函數中初始化子類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM