Java变量保存

Java变量保存,java,arrays,variables,multidimensional-array,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;

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

我想创建一个类,其中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时,不仅modify的值发生了变化,而且firstForm的值也发生了变化。
我已经尝试了
this.modify=firstForm.clone(),但结果相同。谁能帮帮我,告诉我我做错了什么

问题在于您对
最终
关键字的误解

在这种情况下,
final
所做的是变量将包含一个无法更改的引用。但是,引用对象可以更改

现在,在您的代码中,您可以执行以下操作:

this.firstForm = firstForm;
this.modify = firstForm;
因此,两个变量引用相同的引用,这意味着对数组所做的任何更改都将同时显示在
firstForm
modify

您必须复制阵列。有两种拷贝——浅拷贝和深拷贝。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];
  }
}
int[]newarray=newint[firstForm.length][firstForm[0.length];
for(int i=0;i

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

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

在这种情况下,
final
所做的是变量将包含一个无法更改的引用。但是,引用对象可以更改

现在,在您的代码中,您可以执行以下操作:

this.firstForm = firstForm;
this.modify = firstForm;
因此,两个变量引用相同的引用,这意味着对数组所做的任何更改都将同时显示在
firstForm
modify

您必须复制阵列。有两种拷贝——浅拷贝和深拷贝。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];
  }
}
int[]newarray=newint[firstForm.length][firstForm[0.length];
for(int i=0;i

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

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

在这种情况下,
final
所做的是变量将包含一个无法更改的引用。但是,引用对象可以更改

现在,在您的代码中,您可以执行以下操作:

this.firstForm = firstForm;
this.modify = firstForm;
因此,两个变量引用相同的引用,这意味着对数组所做的任何更改都将同时显示在
firstForm
modify

您必须复制阵列。有两种拷贝——浅拷贝和深拷贝。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];
  }
}
int[]newarray=newint[firstForm.length][firstForm[0.length];
for(int i=0;i

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

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

在这种情况下,
final
所做的是变量将包含一个无法更改的引用。但是,引用对象可以更改

现在,在您的代码中,您可以执行以下操作:

this.firstForm = firstForm;
this.modify = firstForm;
因此,两个变量引用相同的引用,这意味着对数组所做的任何更改都将同时显示在
firstForm
modify

您必须复制阵列。有两种拷贝——浅拷贝和深拷贝。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];
  }
}
int[]newarray=newint[firstForm.length][firstForm[0.length];
for(int i=0;i

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

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

您只需将引用的值复制到
firstForm
modify
。你想要什么