用Java分配?

时间:2010-10-04 19:40:33

标签: java

假设我设置了int A = int B.当我改变A之后,它不会改变B的值。但是当我设置SomeClass A = SomeClass B时,我改变了A的内容(比如a.cost),它也会改变B.cost。有人可以向我解释一下吗?

我认为Java是按值分配的,而不是引用?

5 个答案:

答案 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

基本上,请记住一些规则,事情会变得清晰:

  • Java中表达式的值是从不对象 - 只有引用或原始值
  • (第一点的推论)变量从不持有一个对象 - 只有参考或原始值
  • 分配(和参数传递)始终复制值,无论该值是引用值还是原始值

答案 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时,它是按值分配的。