我以为我可以修改copyedInvoice 中的项目,它不会影响originalInoice 中的这些项目。
发生这种情况是因为被复制的是引用变量而不是它自身的对象。
因此,您最终会得到两个指向同一个对象的“引用”。
如果您需要复制整个对象,则可能需要克隆它。
但是,如果您不克隆对象的内部属性(如果它们碰巧是其他对象),您可能会遇到问题。
例如下面的类定义不会给你任何问题。
public class Something {
private int x;
private int y;
private String stringObject;
}
如果您创建它的副本,您将复制其属性的当前值,仅此而已。
但是如果你的类里面确实有另一个对象,你也可以考虑克隆它。
class OtherSomething {
Something something;
private int x;
}
如果您执行以下操作:
Something shared = new Something();
OtherSomething one = new OtherSomething();
OtherSomething two = new OtherSomething();
one.something = shared;
two.something = shared;
在这种情况下,一个和两个对相同的共享“某物”具有相同的引用变量,并且更改其中一个的值会影响另一个。
这就是为什么使用不可变对象更简单/更好/更容易的原因。
如果您需要更改不可变对象的值,您只需创建一个具有正确值的新对象。