0

再一次,我正在寻找绕过这个数组问题的方法,如何?除此以外还有什么办法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 回答