Java对象分配行为不一致?

时间:2014-11-06 21:42:22

标签: java object assign

根据这个答案https://stackoverflow.com/a/12020435/562222,将对象分配给另一个只是复制引用,但让我们看一下这段代码:

public class TestJava {

    public static void main(String[] args) throws IOException {

        {
            Integer x;
            Integer y = 223432;
            x = y;
            x += 23;
            System.out.println(x);
            System.out.println(y);
        }
        {
            Integer[] x;
            Integer[] y = {1,2, 3, 4, 5};
            x = y;
            x[0] += 10;
            printArray(x);
            printArray(y);
        }
    }

    public static <T> void printArray(T[] inputArray) {
        for(T element : inputArray) {
            System.out.printf("%s ", element);
        }
        System.out.println();
    }

}

运行它给出:

223455
223432
11 2 3 4 5 
11 2 3 4 5 

3 个答案:

答案 0 :(得分:4)

行为是一致的。这一行:

x += 23;

实际上为Integer分配了不同的x对象;它不会在该语句之前修改x表示的值(事实上,它与对象y相同)。在幕后,编译器将取消装箱x,然后装入添加23的结果,就像编写代码一样:

x = Integer.valueOf(x.intValue() + 23);

如果检查编译时生成的字节码(在编译后运行javap -c TestJava),就可以看到这一点。

第二部分中的内容是这一行:

x[0] += 10;

还会为x[0]分配一个新对象。但由于xy引用相同的数组,因此也会将y[0]更改为新对象。

答案 1 :(得分:1)

Integer是不可变的,因此一旦创建就无法修改其状态。当你这样做时:

Integer x;
Integer y = 223432;
x = y;
x += 23;

x += 23正在为Integer变量分配新的x值。

另一方面,

数组是可变的,所以当你改变数组的状态时,例如更改数组中的一个元素,另一个是受影响的

答案 2 :(得分:0)

执行此操作x += 23;时,实际创建了另一个对象,并在此新对象上创建了x点。因此,x和y是两个不同的对象。