簡體   English   中英

java編譯器如何引用該類的定義來引用該類?

[英]What does the java compiler do for refrences to a class whithin the definition of that class?

這可能是一個非常原始的問題,但是我從來沒有注意過。 在下面的類定義中,當編譯器看到left的類變量為BinaryNode類型時,它的作用是尚未讀取BinaryNode類的完整定義(當編譯器處理剩余的變量時, BinaryNode尚未定義)?

我的意思是為什么這里沒有發生無限遞歸。

public class BinaryNode {
    public int key;
    public BinaryNode left;
    public BinaryNode right;

    public BinaryNode(int key){
        this.key = key;
    }

}

如果數據結構是無限的,那么沒問題,例如,您可以這樣做:

ArrayList<Object> list=new ArrayList<>();
list.add(list);

沒有問題。 因此,在編譯器中創建引用自身的類描述是沒有問題的。 類描述此時可能不完整,並且稍后完成,就像上面的列表在添加自身之后可以用更多元素填充一樣。

最重要的一點是,有與編譯器試圖遍歷整個參考圖表任何操作 並且在編譯器內不需要這種遍歷。

因此,如果您使用A類編譯引用了B類的A類,則不必接觸C類。如果B == C甚至B == A,則同樣適用。

沒有無限遞歸,因為left可以保存一個null值,因此在任何時候鏈aBinaryNodeObject.left.left.left./*...*/left是有限的。

編譯器將其視為正在使用的當前類的對象。 該對象尚未初始化,因此擁有空值(此刻解析為空)。 當確實對它進行了初始化並對其采取了進一步的措施時,它將搜索當前類以查看如何對其進行初始化(使用相應的匹配構造函數),然后允許您對該對象進行操作並提供對成員方法和變量的訪問。 請注意,這些對象的靜態方法即使不初始化也可以直接使用(就像您在外部使用它一樣)。

據我所知, left是一個引用變量,它尚未在內存中分配並且沒有指向任何東西。按照當前聲明,它直到直到除非我們創建對象並將其分配給它才是對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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