2013-08-20 89 views
-3

如果A類具有B類的引用,而B類具有A類的引用,那麼它在Java中可以接受嗎?如果是的話,當我們執行類A的時候,類B將不會被實例化。那麼編譯器如何執行類B的引用呢?java中的循環引用

TIA

+2

你確定你的意思是這些類有引用嗎?你的意思是說,類「A」的一個對象引用了一個「B」類的對象嗎? – chrylis

+3

你有試過嗎?這可能不會比在這裏提出問題少。 –

+1

而不是描述代碼,寫它,測試它,併發布它,如果你不明白它是如何工作的。 –

回答

1

這很好。

對象A可以參考對象B和對象B可以參考對象A.實際上,你在代碼經常其中節點將引用整個圖表的曲線圖看到這一點,而圖表的引用許多節點。

3

如果A類具有B類的引用,而B類具有A類的引用,那麼它在Java中可以接受嗎?

是的。

當我們執行類A時,類B不會被實例化。那麼編譯器如何執行類B的引用呢?

您必須先創建一個對象,然後再創建一個對象,然後關閉循環;例如像這樣的東西。

A a = new A(); 
B b = new B(a); 
a.setB(b); 

(這裏假定A類已經與setB(A)方法定義的。還有其他的方法來形成循環過,但是這是最簡單的。)


但是請注意,您的術語是完全錯誤的。

  • 你不「執行」一個類。您實例化創建一個類的實例。
  • 編譯器(例如javac)不會「執行」任何東西......它只是編譯代碼。
  • 執行的東西(即運行)Java代碼是Java虛擬機;例如當您使用java命令。

(你學習和使用正確的Java術語,如果你要與其他IT專業人士進行交流是非常重要的。它避免了很多誤解和混亂!)

+0

實際上,你可以從A的構造函數中泄漏'this':'new B(this)'。在實踐中,這發生了很多(糟糕的)GUI代碼。 –

+0

@MarkoTopolnik - 這是真的(如果我正確理解你的意思)......但我試圖保持簡單。 –

+0

這也是一個弊端,所以你要保持乾淨的同時:) –

0

是的,它是可以接受的,在就像編譯器將方法名稱加上簽名:參數類型的調用另存爲文本一樣。

我甚至看到以下恐怖

interface A { 
    final A = new B(); 
} 

class B implements A { 
} 

Java是鬆散結合;有相應的運行時異常拋出。 同樣是針對庫jar的另一個版本進行編譯,並使用具有損壞API的jar運行。