Java变量保存
我有一个问题,我只是不知道如何解决它 我想创建一个类,其中2D int数组保存两次。一次是最后一次,保持原样,还有一次,我可以修改 简言之,我的班级是这样的: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;
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
。你想要什么