假设我设置了int A = int B.当我改变A之后,它不会改变B的值。但是当我设置SomeClass A = SomeClass B时,我改变了A的内容(比如a.cost),它也会改变B.cost。有人可以向我解释一下吗?
我认为Java是按值分配的,而不是引用?
答案 0 :(得分:22)
是的,确实如此 - 但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
基本上,请记住一些规则,事情会变得清晰:
答案 1 :(得分:2)
我认为Java是按值分配的, 不参考?
“按价值分配”是什么意思?您是否可能将其与“按价值/参考传递”混淆?
无论如何,如果你在Java中处理一个类实例,你实际上是在处理对该类的引用(很像C / C ++中的指针)。你的作业只复制引用,所以A和B都引用同一个实例,即共享数据,结果就是结果。
答案 2 :(得分: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。
答案 3 :(得分:0)
在Java中,您的变量可以分为两类:对象和其他所有内容(int,long,byte等)。
基本类型(int,long等)包含您为其指定的任何值。相反,对象变量在某处保持对对象的引用。因此,如果将一个对象变量分配给另一个,则复制了引用,A和B都指向同一个对象。
注意:Java中的字符串实际上是对象,而不是原始元素,初学者通常认为它们就是这样。
希望这有帮助
答案 4 :(得分:0)
在Java中,当您将Object分配给Object时,其通过引用分配。 Int不是Java中的Object,因此当您将int分配给int时,它是按值分配的。