Java Android:更改其他类的数组值
我有两个班。 第一节课是Java Android:更改其他类的数组值,java,android,variables,Java,Android,Variables,我有两个班。 第一节课是 public class A{ private static int[] x = {0,0,0,0}; private static int justX = 0; public A(){} public static int[] getX(){return x;} public static int getJustX(){ return justX;} } 第二节课是 public class B extends . .
public class A{
private static int[] x = {0,0,0,0};
private static int justX = 0;
public A(){}
public static int[] getX(){return x;}
public static int getJustX(){ return justX;}
}
第二节课是
public class B extends . . .{
private int[] x;
private justX;
public B(){
x = A.getX();
justX = A.getJustX();
Log.d("X: ", Arrays.toString(x)); //X: {0,0,0,0}
Log.d("JUST X: ", String.value(justX)); //JUST X: 0;
}
private void onTouch(){
x[0] = 1;
x[1] = 1;
x[2] = 1;
x[3] = 1;
justX = 1;
Log.d("X: ",Arrays.toString(A.getX())); //X: {1,1,1,1}
Log.d("JUST X: ", String.value(A.getJustX())); //JUST X: 0;
}
}
类A中的数组变量已更改,但整数变量未更改,为什么会发生这种情况?问题是您正在更改数组的副本。更改完数组和justX后,必须重新设置
public class A{
private static int[] x = {0,0,0,0};
private static int justX = 0;
public A(){}
public static int[] getX(){return x;}
public static int getJustX(){ return justX;}
public static void setX(int[] a){x = a;};
public static void setJustX(int j){justX = j;}
}
及
问题是您正在更改阵列的副本。更改完数组和justX后,必须重新设置
public class A{
private static int[] x = {0,0,0,0};
private static int justX = 0;
public A(){}
public static int[] getX(){return x;}
public static int getJustX(){ return justX;}
public static void setX(int[] a){x = a;};
public static void setJustX(int j){justX = j;}
}
及
您所遇到的是,对于基本类型(如
int
),Java总是按值传递,但是对于对象类型,它要复杂一些(数组就是对象)。具体来说,分配给引用类型的变量会更改它引用的对象,但不会创建新对象。分配给基元变量只会更改该变量的值
让我们走走
public class B extends . . .{
private int[] x;
private justX;
public B(){
x = A.getX();
此时,您已将B.x
作为对a.x
作为引用的同一数组的引用。所以它们都是相同数据结构的名称
justX = A.getJustX();
这里,justX
刚刚得到了A.justX
的值(0)
在这里,您已经访问了B.x的内部B.x
,并更改了其中部分的值。但它也是A.x
所指的同一个对象,因此当您查看A.x
时,您将看到这些相同的更改
justX = 1;
这里你只需要取B.justX
并给它一个新值
Log.d("X: ",Arrays.toString(A.getX())); //X: {1,1,1,1}
Log.d("JUST X: ", String.value(A.getJustX())); //JUST X: 0;
}
}
希望这能解释为什么你会得到这样的结果。如果要更改
A.justX
,则需要显式执行此操作。如果希望能够在不更改A.x
的情况下更改B.x
,则需要显式创建一个新对象(例如,使用.clone()
) 您遇到的是,Java总是为基本类型(如int
)传递值,但对于对象类型,它要复杂一些(数组就是对象)。具体来说,分配给引用类型的变量会更改它引用的对象,但不会创建新对象。分配给基元变量只会更改该变量的值
让我们走走
public class B extends . . .{
private int[] x;
private justX;
public B(){
x = A.getX();
此时,您已将B.x
作为对a.x
作为引用的同一数组的引用。所以它们都是相同数据结构的名称
justX = A.getJustX();
这里,justX
刚刚得到了A.justX
的值(0)
在这里,您已经访问了B.x的内部B.x
,并更改了其中部分的值。但它也是A.x
所指的同一个对象,因此当您查看A.x
时,您将看到这些相同的更改
justX = 1;
这里你只需要取B.justX
并给它一个新值
Log.d("X: ",Arrays.toString(A.getX())); //X: {1,1,1,1}
Log.d("JUST X: ", String.value(A.getJustX())); //JUST X: 0;
}
}
希望这能解释为什么你会得到这样的结果。如果要更改
A.justX
,则需要显式执行此操作。如果希望能够在不更改A.x
的情况下更改B.x
,则需要显式创建一个新对象(例如,使用.clone()
) Java对象使用值指针来保持对其对象的引用。所以A.x和B.x指向相同的值。Java对象使用值指针来保持对其对象的引用。所以A.x和B.x指向相同的值。是的,这解决了我的问题。我刚发现,因为我不是从一开始就学会了java。在我了解clone()
之前,我只是使用int[]tmp=A.getX()
中的循环设置B.x
,然后设置B.x
。谢谢亚当。是的,这解决了我的问题。我刚发现,因为我不是从一开始就学会了java。在我了解clone()
之前,我只是使用int[]tmp=A.getX()
中的循环设置B.x
,然后设置B.x
。谢谢亚当。