Java 改变一个变量会改变另一个变量
当我创建一个球的实例,然后将其复制到另一个变量时,更改原始值也会更改球的副本。例如,以下面非常简化的示例为例:Java 改变一个变量会改变另一个变量,java,object,Java,Object,当我创建一个球的实例,然后将其复制到另一个变量时,更改原始值也会更改球的副本。例如,以下面非常简化的示例为例: class Ball() { Color _color; public Ball(Color startColor) { _color = startColor; } public void setColor(Color newColor) { _color = newColor; } } Ball myBall
class Ball() {
Color _color;
public Ball(Color startColor) {
_color = startColor;
}
public void setColor(Color newColor) {
_color = newColor;
}
}
Ball myBall = new Ball(black);
Ball mySecondBall = myBall;
myBall.setColor(white);
我省略了一个访问器方法,但是如果我得到球的颜色,它们现在都是白色的!因此,我的问题是:
- 为什么更改一个对象会更改其副本,以及
- 有没有办法复制一个对象,这样你就可以独立地修改它们
Ball mySecondBall=myBall代码>
这不会创建副本。您可以指定一个引用。两个变量现在都指向同一个对象,这就是为什么两个变量都可以看到更改。
您应该做一些事情,比如创建一个新球
复制相同的颜色:
Ball mySecondBall=newball(myBall.getColor())代码>没有副本,在此分配之后有两个对Ball
的相同实例的引用:
Ball mySecondBall = myBall;
要创建副本,请为Ball
实现副本构造函数:
class Ball() {
Color _color;
public Ball(Color startColor) {
_color = startColor;
}
public Ball(final Ball otherBall) {
_color = otherBall._color;
}
public void setColor(Color newColor) {
_color = newColor;
}
}
使用:
Ball myBall = new Ball(black);
Ball mySecondBall = new Ball(myBall);
您只有一个球
对象。myBall
和mySecondBall
都指向相同的Ball
对象。正如其他人所说,问题是您有两个对同一实际实例的引用。我喜欢用一个比喻,同一台电视有两个遥控器
如果你想要两个球,你可以这样做:
class Ball() {
public Ball(Ball original){
_color = original.getColor();
}
...etc...
}
Ball myBall = new Ball(black);
Ball mySecondBall = new Ball(myBall);
myBall.setColor(white);
上述解决方案肯定会奏效
对象是复合值,因此将对象等同于某个变量不会创建其副本,而是传递其引用。因此,改变一个会影响另一个。
如果有人想知道更多的方法来解决这个问题,他们可以尝试以下任何一种方法-
Ball mySecondBall=JSON.parse(JSON.stringify(myBall))
或
Ball mySecondBall=Object.assign({},myBall)
myBall
不是Ball
;这是对球的引用。有没有一种方法可以复制一个物体,这样你就可以在不改变新物体的情况下改变原来的物体?@RobAlejandroVolgman:是的。创建一个复制构造函数,只需复制所有成员变量就可以了!我想要+1,但还需要1个代表:(