說我設置int A = int B.當我改變後,它不會改變B的值。但是當我設置SomeClass A = SomeClass B,並且我改變A的內容(如a.cost)時,它也改變B.cost。誰可以給我解釋一下這個?在Java中指定?
我以爲Java是按值賦值的,而不是引用?
說我設置int A = int B.當我改變後,它不會改變B的值。但是當我設置SomeClass A = SomeClass B,並且我改變A的內容(如a.cost)時,它也改變B.cost。誰可以給我解釋一下這個?在Java中指定?
我以爲Java是按值賦值的,而不是引用?
是的,它的確如此 - 但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已分配的值, 沒有提及?
「按價值分配」是什麼意思?你可能會把它與「傳遞價值/參考」混爲一談?無論如何,如果你在Java中處理一個類實例,你實際上正在處理對該類的引用(就像C/C++中的指針一樣)。您的分配僅複製參考,因此A和B都指向相同的實例,即數據是共享的,因此是結果。
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吧)
在Java中,你的變量可以分爲兩類:對象和其他所有內容(int,long,byte等)。
原始類型(int,long等)包含您分配的任何值。相比之下,對象變量持有對某個對象的引用。因此,如果您將一個對象變量分配給另一個對象,則您已將該引用複製,A和B都指向同一個對象。
注:Java中的字符串實際上是對象,而不是初學者經常假設的基元。
希望這有助於
Java是嚴格按照價值傳遞。當通過值傳遞引用時,只有引用被複制,而不是被引用的對象。 – 2010-10-04 22:03:20
@Maven,當然,這是一個愚蠢的錯誤,我想到了一個,並寫下了其他的:)謝謝 – Bozho 2010-10-04 22:07:14