分配默认值:java

时间:2013-07-10 10:36:54

标签: java android

boolean temp1,temp2;

        temp1 = true;
        temp2 = temp1;
        Log.d("rvg", "temp1:"+temp1+"    temp2:"+temp2);

        temp1 = false;
        Log.d("rvg", "temp1:"+temp1+"    temp2:"+temp2);

当我执行此操作时,我得到了

temp1:true    temp2:true
temp1:false      temp2:true

但我已经改为阵列

boolean[] Temp1,Temp2;
        Temp1 = new boolean[1];
        Temp2 = new boolean[1];
        Temp1[0] = true;
        Temp2   = Temp1;

        Log.d("rvg", "Temp1:"+Temp1[0]+"    Temp2:"+Temp2[0]);
        Temp1[0] = false;
        Log.d("rvg", "Temp1:"+Temp1[0]+"    Temp2:"+Temp2[0]);

当我执行此操作时,我获得了Temp1和Temp 2的相同值。

Temp1:true  Temp2:true
Temp1:false     Temp2:false

如何避免这种情况?

6 个答案:

答案 0 :(得分:2)

您需要复制数组。而不是

Temp2 = Temp1;

DO

Temp2 = Arrays.copyOf(Temp1, Temp1.length);

答案 1 :(得分:1)

在第一种情况下,temp2读取temp1(true)并在其中设置true值。在第二种情况下,您将为两个数组分配相同的内存,因此它们内部的值是相同的。

解决方案:

Temp2[0]   = Temp1[0];

Temp2 = Arrays.copyOf(Temp1, Temp1.length);

第一种情况将读取temp1 [0]内的值并将其分配给temp2 [0]。在第二种情况下,Temp2将是Temp1的新副本,不共享相同的内存,因此您可以独立修改每个

答案 2 :(得分:1)

数组变量是引用。当您说Temp2 = Temp1;时,您将对名为Temp2的数组的引用分配给变量Temp1,以便两者都引用相同的数组。不相等,相同。因此,当您使用其他引用时,使用其中一个引用在此数组中完成的所有更改都是可见的。这就是为什么你得到相同的结果。

答案 3 :(得分:0)

简短回答:你无法避免这种情况。由于Java中的数组基本上是一个对象(或者至少被视为对象),Temp2 = Temp1;Temp2指向与Temp1相同的内存块。因此,如果您更改Temp1Temp2将反映这些更改。

使用基元类型boolean时它的行为不同的原因是temp2 = temp1;会复制temp1。但是temp2仍有自己的记忆块。

为了使数组与基本类型具有相同的行为,您可以使用Arrays.copyOf(boolean[], int)代替。无论数组的大小如何,它都能正常工作。

答案 4 :(得分:0)

我不明白您发布的代码有什么问题以及您希望实现的目标。

但是我很确定这个问题与boolean是java中的原始数据类型这一事实有关。这意味着每个布尔变量都存储一个值,=运算符将值从一个变量复制到另一个变量。

相反,当您使用数组时,您有两个变量作为对同一内存位置的引用。因此,当您更改一个变量的值时,您会看到更改传播到另一个变量,因为您正在从同一个内存位置读取。

答案 5 :(得分:0)

在第一个示例中,temp1和temp2是基本类型(不是对象)。将temp1分配给temp2时,只分配值,但有两个不同的变量temp1和temp2。如果更改值1,则另一个不会更改。

在第二种情况下,Temp1和Temp2是数组(对象)。当您将Temp1分配给Temp2时,您说Temp2是指向Temp1指向的同一对象的指针:相同的对象,两个用于访问它的变量。如果您更改通过Temp1访问或通过Temp2访问的对象,则您将更改同一对象。

如果你想避免这种情况,你必须保留两个不同的对象,只改变值,即:

Temp2[0]=Temp1[0]
而不是

Temp2=Temp1