用Java分配?

假设我设置了int A = int B.当我改变A之后,它不会改变B的值。但是当我设置SomeClass A = SomeClass B,并且我改变A的内容(如a.cost)时,它改变了B .cost也是。 谁可以给我解释一下这个?

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

是的,它确实 – 但A的值是一个引用,而不是对象本身的副本。

我想给出以下类比……

假设有两个人都有我的地址:这就像两个类型为House in Java的变量。 现在他们中的一个来了,把我的门涂成红色。 如果他们访问,第二个人仍然会看到红色的门:

 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是按值分配的,而不是引用?

“按价值分配”是什么意思? 您是否可能会将其与“按值传递/参考”混淆?

无论如何,如果你在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是按值传递的。请查看此文章 。)

在Java中,您的变量可以分为两类:对象和其他所有内容(int,long,byte等)。

基本类型(int,long等)包含您为其分配的任何值。 相反,对象变量在某处保存对对象的引用。 因此,如果将一个对象变量分配给另一个,则复制了引用,A和B都指向同一个对象。

注意:Java中的字符串实际上是对象,而不是原语,初学者通常会这样做。

希望这可以帮助