2014-03-07 101 views
0

我不知道這是否只是我,或者如果它的東西我應該知道,但如果我這樣做:如何在多個變量引用中共享可變變量的屬性?

Object a = 1; 
Object b = a; 
b = 2; 

然後,是相同的值爲b。這是正常的行爲嗎?因爲我想複製變量,而不是引用它。

我之所以問的是我有一些像這樣的代碼:

center = new Point(0.0f,1.0f,1.0f); 
returnPoint = center; 
... 
returnPoint.x = 1.0f; 
//For some reason, above modifies center as well as return 
+3

你的兩個例子不完全相同。你測試過第一個代碼了嗎?我認爲它也不會改變'a'。 –

+0

我有,我已經得到所有這些輸出線的代碼來檢查returnPoint中的值,但它並沒有改變(就像我不希望它),直到我修改中心 – DuskFall

+0

Java通過值傳遞引用 - 這正是如何它應該工作。 –

回答

3

您可以嘗試這樣的事:

center = new Point(0.0f,1.0f,1.0f); 
returnPoint = center.clone(); 
... 
returnPoint.x = 1.0f; 

克隆方法將創建另一個實例擁有相同的值。

+0

嗯...對,謝謝 – DuskFall

+0

它是否也像枚舉一樣工作?如在,我是否需要克隆它們呢? – DuskFall

+0

Java枚舉不可克隆。按照設計,JVM上的每個枚舉值應該只有1個實例。 – andreban

2

在「returnPoint = center」中,您不需要複製中心,您可以參考它。因此,當你修改returnPoint時,你也修改了center。

0

在Java中,如果您有兩個非原始數據類型的變量,那麼設置爲等於另一個不會產生克隆。你必須顯式克隆第一個變量。

2

然後,是相同的值爲b

號通過這樣做b = 2,你做b = new Integer(2);。因此ab不再一樣了。

關於第二個實施例,這是正常的:returnPoint相同的參考center;如果修改了returnPoint的內容,則可以修改center的內容,因爲它們「引用」完全相同的對象。您需要複製center

除了.clone()以外的其他解決方案之一是製作複製構造函數(即將另一個Point作爲參數)。

0

如果你想存儲的值,你需要有3個浮點變量,並將它們存儲在裏面的值。但請記住使用「浮動」,而不是「浮動」。

2

你的榜樣

Object a = 1; 
Object b = a; 
b = 2; 

不描述了同樣的問題作爲你的其他代碼。以上示例將導致a = new Integer(1),而b = new Integer(2)。請注意,整數實例是不可變的,但不適用於Point

爲了解出了什麼問題,可以考慮一個可變整數類:

class MutableInteger { 
    public int value; 
} 

現在讓我們使用這個類來重新創建Point - 相關代碼的問題,您的第一個示例代碼:

MutableInteger mi = new MutableInteger(); 
mi.value = 1; 
Object a = mi; 
Object b = a; 
mi.value = 2; 

將導致ab指向MutableInteger的相同實例。由於您更改後一個實例的值,b的更改將影響a引用的值。但它不會改變a的任務!

爲了避免您的問題,您不應該共享Point實例。使用:

returnPoint = new Point(center); 

爲了創建描述相同座標的新點。你可以改變複製的點而不改變center點的表示。