public static void main(String[] args) {
Integer i = new Integer(1);
Integer j = new Integer(2);
i = 10;
i = 20;
swap(i, j);
System.out.println(i + "," + j); //10,20
}
private static void swap(Integer i, Integer j) {
Integer n = i;
i = j;
j = n;
System.out.println(i + "," + j); //20,10
}
虽然参数传递的是引用对象,但是Integer源码里用来存储int对象的value使用了final进行修饰:
//...
private final int value;
public Integer(int value) {
this.value = value;
}
//...
所以我们无论如何也无法对该值进行修改了。
但为何使用=赋值final对象而编译器和IDE均不报错?
笔者猜测为=右侧是一个new方法,已不再是原本的对象。(这里=不是赋值行为,是new行为)
从c语言角度理解:形参i,j都是指针,使用=已经是在调用malloc(),而非在修改引用成员。