2010-09-19 52 views
1

我是Java處女。你如何閱讀:關於方法調用和在對象中創建新對象的問題

(current.getPlayer()).getID() < p.getID()) 

2方法調用是否同時發生?

我也有一個單獨的問題。如果你是一個新的對象中創建一個新的對象,如

Playernode nd=new Playernode(new Player(p)); 

這是完全合法的,是不是播放器類的第一個對象,它似乎並沒有在垃圾收集危險的直接對象引用離開堆?

回答

3

我是Java處女。你怎麼看:(current.getPlayer()).getID()< p.getID())

它的兩個子表達式之間的關係表達式,評估爲true或false。

第一個變量是

(current.getPlayer()).getID() 

第二個變量是

p.getID() 

您將有一個編譯器錯誤,因爲有一個額外的右括號。

2個方法調用是否同時發生?

不,有三個:一個用於當前實例上的getPlayer(),另一個用於該Player實例上的getID(),第三個用於p上的getID(),我假設它是另一個實例播放器。 「一下子」讓我思考線程化。在你的情況下,這一切都以串行方式發生在單個線程上。

我也有一個單獨的問題。如果你在一個新對象中創建一個新對象,例如Playernode nd = new Playernode(new Player(p));這是完全合法的,不是Player類的第一個對象p,它沒有直接的對象引用有堆積垃圾收集的危險?

傳遞給Player(副本)構造函數的參數是一個引用,所以它不會被gc'd。如果您將Playernode類中的私人數據成員分配爲指向新玩家,它將指向新的玩家引用。看起來像初始化它與p有相同的狀態,即使它不指向相同的引用。

沒有危險的被gc'd。

+0

Nitpick - *「兩個變量之間的布爾比較」*。實際上,它是兩個*子表達式*之間的*關係表達式*,子表達式是*非*變量。 – 2010-09-19 02:31:52

+0

Nitpick的確如此。 – duffymo 2010-09-19 12:06:39