2011-05-02 91 views
5

我知道Java並不真正使用確切的引用傳遞,而是傳遞引用副本。這就是爲什麼試圖交換引用的交換函數在Java中不起作用的原因。 for-each循環是否也這樣做?例如,給定以下代碼...每個循環的Java是否返回引用或參考副本?

for (Constraint c : getLeafNodes(constraintGraph)){ 
    c = new Constraint(); 
} 

...我想要通過遞歸定義的樹狀結構,並查找所有葉節點。每個葉節點需要用新的空節點替換。這會做我所期望的嗎?還是僅僅將每個葉節點的引用副本設置爲新節點?

我在另一段通過單元測試的代碼上寫了一個類似的方法,這使得我認爲for-each循環使用引用,而不是引用副本,但是我們的代碼質量軟件將其標記爲本地死區變量,重大錯誤。

謝謝。

+0

for-each循環不返回任何東西(給誰?)。你的問題與標題不符。 – 2011-05-02 15:55:49

回答

10

這也不行。這就如同說

Object c = getObject(); 
c = new Object(); 

你所做的只是改變什麼c是指。即使Java支持真傳遞,這也不起作用

+2

噢,你說得對。我不知道我在想什麼。我應該檢索每個葉的父項,然後調用某種parent.setChild(新的約束())方法。謝謝。 – rybosome 2011-05-02 15:39:34

0

不,它不會做你期望的。 c是一個局部變量,它引用/指向由getLeafNodes返回的集合中的元素。 Java沒有參考概念你提到,一切都是參考副本。如果你知道例如C或C++,請將java中的對象變量視爲指針未引用。

4

簡短的回答:參考拷貝

當你分配一個迭代的變量,它不會被傳播到集合中。將迭代器看作列表的只讀訪問。

Java的for循環工程完全按照C#的for-each環,其中whileEnumerator可以moveNext將分配給本地變量Current元素

相關問題