代码1:
Car car1 = new Car();
Car car2 = new Car();
car2.setColor("Green");
car2.setModel("I20");
car1 = car2;
System.out.println(car1.getColor() + " , " + car1.getModel());
System.out.println(car2.getColor() + " , " + car2.getModel());
car1.setColor("Red");
car1.setModel("I10");
System.out.println(car1.getColor() + " , " + car1.getModel());
System.out.println(car2.getColor() + " , " + car2.getModel());
输出
Green , I20
Green , I20
Red , I10
Red , I10
此处car1 = car2;
使car1
对象引用car2
对象,因此对car1
的任何进一步更改等同于更改car2
对象,因为两者都是引用相同的值。
代码2:
Integer c = 5;
Integer d = 10;
System.out.println(c + ", " + d);
c = d;
System.out.println(c + ", " + d);
c = 7;
System.out.println(c + ", " + d);
输出
5, 10
10, 10
7, 10
此后,c = d;
c
和d
引用同一个值后,为什么更改c
的值不会更改d
的值?
答案 0 :(得分:1)
整数是不可变的。这意味着它不能以这种方式改变。您不能更改其内部字段。您不能更改它指向的内存中的哪个位置,但您可以更改分配给给定Integer的引用的值。例如,当你写
Integer i = 5;
Integer j = 10;
i = j;
这并不意味着从现在开始i
指向内存中j
指向的同一位置。它只是将j
中存储的值分配给i
,因为只允许不可变类型。
答案 1 :(得分:0)
否,因为您在c中指定值d而不是反向。 你明白吗 ? 如果你想要在d中给出值c,你可以写d = c来表示c
的重新参考答案 2 :(得分:-2)
因为java.lang.Integer比Car有点特殊。 Integer类只包装java原始int,其equals方法在原始int上进行求值。
当你指定c = d时,它会将内部int设置为10但仍然是那两个内部int是不同的(不引用相同的内存)。因此,稍后对c的重新分配不会改变d的值。
您可以阅读javaDoc以获取更多详细信息:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html