0

繰り返しますが、この配列の問題を回避する方法を探しています。以外に方法はありますclone()か?clone() との戦い、保護、および実装がうまくいかなかったので、私は尋ねています...

//assuming you have proper class and constructor (point(int x, int y))    
/*
   point 7POINTSARRAY[]=new point[7];
   for(int i=0;i<7;i++)
   {
   7POINTSARRAY[i].x=i;
   7POINTSARRAY[i].y=i;
   }
//This won't work, so...
 */

point B = new point(0,0); // You need this.
for(int i=0;i<7;i++){
    7POINTSARRAY[i]=B;     // And this. 
    //But I want to read and assign value only,
    //  not establish a reference, so it can work How?
    7POINTSARRAY[i].x=i;
    7POINTSARRAY[i].y=i;
    System.out.println(7POINTSARRAY[i].x);
}
System.out.println(7POINTSARRAY[1].x); 

目的の出力は A[1].x=1 ですが、何度か上書きされ、現在は A[1].x = 7 になっています。

4

3 に答える 3

2

pointすべての要素が異なるオブジェクトを参照するようにする場合は、配列のすべての要素に対して新しいを作成する必要があります。

    for(int i=0;i<7;i++)
    {
        point B = new point(0,0); // Put this *inside* the loop
        7POINTSARRAY[i]=B;        // Now B is a new instance of point
        7POINTSARRAY[i].x=i;
        7POINTSARRAY[i].y=i;
        System.out.println(7POINTSARRAY[i].x);
    }
    System.out.println(7POINTSARRAY[1].x); // should now print 1

私はあなたのコードのフォーマットを変更していませんが、それを改善することで上記がより明確になり、理解しやすくなります。

于 2012-12-18T23:22:39.043 に答える
0

申し訳ありませんが、Java は複雑なオブジェクトの参照でのみ機能します。正しく使用および実装する必要がclone()ありますが、これは問題ではありません。clone()明確に定義されたアプローチです。

最初のレベルのクラスの典型的なクローンは次のようになります

    @Override
    public Object clone() {
        try {
            A ans = (A) super.clone();

            // do complex stuff

            return ans;

        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }

    }

この線

A ans = (A) super.clone();

デフォルトの複製を行います。これには、複製オブジェクトが含まれますが、メンバーは含まれません。メンバーのクローンをカスケードする必要があります。clone()はメンバーであるため、親の保護されたメンバーにアクセスできます。

親がCloneableいるなら書くべき

    @Override
    public Object clone() {
        A ans = (A) super.clone();

        // do complex stuff

        return ans;
    }

親は例外をスローできないためです。

たとえば、次のようなポイント クラスがあるとします。

class point {
   public point(double x, double y) { this.x = x; this.y = y; }
   public double x;
   public double y;
}

次に、次の方法で修正する必要があります

class point implements Cloneable {
   public point(double x, double y) { this.x = x; this.y = y; }
   public double x;
   public double y;
}

クローン可能にします。

それからあなたは書くことができるでしょう

point a = new point(1,2);
point b = (point) a.clone();

そしてあなたは2つの別々のコピーを手に入れます。

于 2012-12-18T23:38:32.810 に答える
0

問題はラインにあります

7POINTSARRAY[i]=B

これは、7POINTSARRAY の各オブジェクトが同じオブジェクト B を参照 (またはポイント) することを意味します。

そのため、ループ内で行う場合

7POINTSARRAY[i].x=i;
            7POINTSARRAY[i].y=i;

実際には常に B を変更します。

代わりに次のことを行う必要があります。

for(int i=0;i<7;i++){
    7POINTSARRAY[i] = new point(i,i);
}
于 2012-12-18T23:25:11.430 に答える