Java变量保存

时间:2014-02-09 14:32:12

标签: java arrays variables multidimensional-array

我有一个问题,我只是不知道如何解决它。

我想创建一个类,其中2D int数组被保存两次。有一次作为最后一次保持它是一个,我可以修改。

简而言之,我的课程看起来像这样:

private static class Class {
    private final int[][] firstForm;
    private int[][] modify;

    public Class(int[][] firstForm){
        this.firstForm = firstForm;
        this.modify = firstForm;
//I also already tried .clone() on both
    }

    public void setValue(int x, int y, int val){
        if(firstForm[x][y]!=0){
            System.out.println("ERROR!);
            return;
        }
        modify[x][y]=val;
    }
}

现在当我使用函数setValue时,不仅修改了修改的值,而且还使用了firstForm之一。 我已经尝试了this.modify = firstForm.clone();,但结果是一样的。有人可以帮帮我,告诉我我做错了什么?

3 个答案:

答案 0 :(得分:3)

问题在于您对final关键字的误解。

在这种情况下,final的作用是该变量将保存一个无法更改的引用。但是,引用的对象可以更改。

现在在您的代码中执行:

this.firstForm = firstForm;
this.modify = firstForm;

因此,两个变量都引用相同的引用,这意味着对数组所做的任何更改都将同时显示在firstFormmodify中。

您必须复制该数组。有两种副本 - 浅和深。 Shallow会将数组的对象复制到另一个数组中(使用不同的引用) - 这对于int数组来说就足够了。如果数组是另一种对象类型,则必须进行深层复制以确保不变性。

要制作副本,请使用两个嵌套的for循环:

int[][] newarray = new int[firstForm.length][firstForm[0].length];

for(int i = 0; i < firstForm.length; i++){
  for(int j = 0; j  < firstForm[i].length; j++){
    newarray[i][j] = firstForm[i][j];
  }
}

请注意,clone()方法执行浅拷贝 - 这意味着它将数组的内容复制到另一个数组,但是二维数组只包含对一维数组的引用!这是不行的。

答案 1 :(得分:0)

您只是将引用的值复制到firstFormmodify。你要为final做的是复制初始数组的内容(firstForm),而不是对它的引用。

答案 2 :(得分:0)

您的问题正在发生,因为两个2D数组都引用了同一个对象。

在Java中,对象通过引用传递 - 对象的引用是该对象在内存中的位置。所以,当你说,

    this.firstform = firstform;
    this.modify = firstform;

你实际上在说“this.firstform应该指向firstform的内存中的位置,所以this.modify应该这样”,所以它们实际上是相同的。 .clone()方法应该可以工作:/你可能没有正确使用它...但是,你可以手动执行它(如构造函数):

    for(int i = 0; i < firstform.length; ++i)
    {
        for(int j = 0; j < firstform[i].length; ++j)
        {
             modify[i][j] = firstform[i][j];
        }
    }

虽然这很难看。

显然,在执行上述操作之前,您必须在两个维度中将修改初始化为与firstform相同的大小。