2010-10-04 16 views
5

說我設置int A = int B.當我改變後,它不會改變B的值。但是當我設置SomeClass A = SomeClass B,並且我改變A的內容(如a.cost)時,它也改變B.cost。誰可以給我解釋一下這個?在Java中指定?

我以爲Java是按值賦值的,而不是引用?

回答

19

是的,它的確如此 - 但A的值是一個引用,而不是對象本身的副本。

我想給以下類推......

假設兩個人都有我的地址:這就是象Java House類型的兩個變量。現在他們中的一個來了,把我的門漆成紅色。第二個人仍然會看到紅色的大門,如果他們訪問:

House jonsHouse = new House(); // Even the variable jonsHouse is only a reference 

House firstAddressCopy = jonsHouse; // Just a copy of the reference 
House secondAddressCopy = jonsHouse; // Just a copy of the reference 

firstAddressCopy.paintDoor(Color.Red); 

Color color = secondAddressCopy.getDoorColor(); // Now color will be red 

基本上,記住一些規則,事情就會變得清晰:

  • Java中的表達式的值是從未的對象 - 永遠只引用或原始值
  • (第一點的推論)的可變從未保持對象 - 永遠只引用或原始值
  • 分配(和參數傳遞)總是複製值,該值是否爲參考或原始值
2

我認爲Java已分配的值, 沒有提及?

「按價值分配」是什麼意思?你可能會把它與「傳遞價值/參考」混爲一談?無論如何,如果你在Java中處理一個類實例,你實際上正在處理對該類的引用(就像C/C++中的指針一樣)。您的分配僅複製參考,因此A和B都指向相同的實例,即數據是共享的,因此是結果。

1

A是對象的引用。因此,如果您更改對象內部狀態,它將反映到指向它的每個其他變量。

如果重新分配A,然後B不會改變:

Foo a = new Foo(); 
Foo b = a; 
a.bar = "bar"; // this is reflected in b 
a = new Foo(); // b stays pointing to the previous Foo 
a.bar = "baaar"; // b stays with a value of bar="bar" 

(。Java是按值檢查this article吧)

+0

Java是嚴格按照價值傳遞。當通過值傳遞引用時,只有引用被複制,而不是被引用的對象。 – 2010-10-04 22:03:20

+0

@Maven,當然,這是一個愚蠢的錯誤,我想到了一個,並寫下了其他的:)謝謝 – Bozho 2010-10-04 22:07:14

0

在Java中,你的變量可以分爲兩類:對象和其他所有內容(int,long,byte等)。

原始類型(int,long等)包含您分配的任何值。相比之下,對象變量持有對某個對象的引用。因此,如果您將一個對象變量分配給另一個對象,則您已將該引用複製,A和B都指向同一個對象。

注:Java中的字符串實際上是對象,而不是初學者經常假設的基元。

希望這有助於