Java でデータ構造を開発しようとしていますが、解決できない問題に直面しています。オブジェクトへの参照があり、それをコピーした後、コピーのみを使用して元の参照を変更したいと考えています。例えば:
Point a = new Point(0,0);
Point b = a;
b = new Point(5,5);
「a」が「b」だけでなく「new Point(5,5)」も指すようにします。とにかくそれを行うことはありますか?
助けてくれてありがとう。
Point a; // no need to instantiate
Point b = new Point(5,5);
a = b;
セッターメソッドを作成すると、次のことが可能になります。
Point a = new Point(0,0);
Point b = a;
//b and a now reference the same point
b.setX(5);
b.setY(5);
//Now we have made changes to the point referenced by b
//Since a references the same point, these changes will
//also apply to a
あなたの例の問題はあなたがしているということですnew Point(x,y)
。
Point a = new Point(0,0);
Point b = a;
//At this point only one instance of Point exists.
//Both a and b reference the same Point.
//Any change you do to that point will be reflected through both a and b.
b = new Point(5,5);
//Now you have created a second instance of point.
//a and b reference the different points.
したがって、要約すると、既存のポイントを変更することと新しいポイントを作成することと、参照の1つだけに新しいポイントを参照させることの違いを理解する必要があります。
Javaではそれができません。Point のラッパーを作成してシミュレートできます。
public class PointWrapper {
private Point point;
public PointWrapper(Point point) {
this.point = point;
}
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
}
PointWrapper a = new PointWrapper(new Point(0,0));
PointWrapper b = a;
b.setPoint(new Point(5,5));
を作成するnew Point(5,5)
と、新しい参照が に割り当てられるためb
、 と で異なる参照を持つことにa
なりb
ます。
同じインスタンスへの参照を保持し、 への変更が にb
も「見える」ようにする唯一の方法a
は、元のオブジェクトに新しい値 (5,5) を設定することです (これもAlderathから説明されています)。
b.setX(5);
b.setY(5);