从"java传参只传引用"了解Integer作为形参传参

2019-10-31  本文已影响0人  sudaR
    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(),而非在修改引用成员。

上一篇下一篇

猜你喜欢

热点阅读