3

ボールのインスタンスを作成し、それを別の変数にコピーすると、元の変数を変更すると、ボールのコピーも変更されます。たとえば、以下の非常に単純化された例を見てください。

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);

_colorのアクセサメソッドを省略しましたが、ボールの色を取得すると、両方とも白になります。だから私の質問は:

  • 1つのオブジェクトを変更すると、そのコピーが変更されるのはなぜですか。
  • オブジェクトをコピーして、個別に変更できるようにする方法はありますか?
4

5 に答える 5

5

Ball mySecondBall = myBall;

これはコピーを作成しません。参照を割り当てます。両方の変数が同じオブジェクトを参照するようになったため、両方の変数に変更が表示されます。同じ色のコピー
を作成するようなことをする必要があります。new Ball

Ball mySecondBall = new Ball(myBall.getColor());

于 2012-07-06T20:24:34.333 に答える
2

コピーはありませんBall。この割り当ての後の同じインスタンスへの2つの参照があります。

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);
于 2012-07-06T20:24:56.230 に答える
0

Ballオブジェクトは1つだけです。myBallと参照の両方が同じオブジェクトmySecondBallを指しています。Ball

于 2012-07-06T20:25:28.663 に答える
0

他の人が言っているように、問題は、同じ実際のインスタンスへの2つの参照があることです。私が使いたいアナロジーは、同じテレビに2つのリモコンがあるということです。

2つのボールが必要な場合は、次のようにします。

class Ball() {
  public Ball(Ball original){
      _color = original.getColor();
  }
...etc...
}

Ball myBall = new Ball(black);
Ball mySecondBall = new Ball(myBall);
myBall.setColor(white);
于 2012-07-06T20:29:42.373 に答える
0

上記の解決策は確実に機能します。

オブジェクトは複合値であるため、オブジェクトをある変数と同等にすることによって、そのコピーは作成されず、むしろその参照が渡されます。したがって、1つを変更すると別の影響があります。誰かがこれを解決するためのより多くの方法を知りたい場合、彼らは以下の方法のいずれかを試すことができます-

Ball mySecondBall = JSON.parse(JSON.stringify(myBall));

また

Ball mySecondBall = Object.assign({}、myBall);

于 2018-07-28T06:05:27.340 に答える