Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:更改其他类的数组值_Java_Android_Variables - Fatal编程技术网

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
。谢谢亚当。