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个代表:(