以Integer类型传参值不变来理解Java值传参

最近在写代码的时候出了一个错误,由于对值引用理解的不深,将Integer传入方法中修改,以为传入后直接修改Integer中的值就不用写返回值接收了,虽然很快发现了问题,但还是来总结一下

首先是代码:

public static void main(String[] args){
    Integer a1 = 5;
    updateInteger(a1);
    System.out.println(a1);
}

public static void updateInteger(Integer var){
    var = 10;
}

打印输出的结果是5,应该是毫无疑问的,可当时为什么我会认为a1应该是10呢?

大概是平时经常obj.integer = number习惯了,所以觉得操作了一个引用就可以修改对象里的值

实际情况是a1传入方法后如图

当我执行var = 10 的值以后,由于jdk1.5自动装箱的特性,实际情况是等价于执行  var = Integer.valueOf(10);

valueOf()方法 参看源码 会根据传入的数值 如果在-128-127之间 就从常量池中获取一个Integer对象返回

如果不在范围内 会new Integer(var)返回

那么执行 var = 10以后 可以用下图表示

当时我天真的以为是操作了那个5变成了10 

好了  ,这两张图已经足够说明Java传参为什么是值传参而不是引用传参了

总结一下:

值传参:将传入的值拷贝一份   ,比如传入int a = 5,并不会将变量a的地址传给方法

               又或者传入对象类型Integer a1 =5 ,a1本身是个引用传入方法后不会直接将a1这个引用传入,而是重新复制一份引用到方法参数中  ,有点绕 不理解? 想一下如果是将a1真实的传入上述的方法中,那就变成a1 = new Integer(10) ,结果就不一样了,变成下图所示,当然这是在JAVA中不可能的

a1和var没有分别,就是同一个变量

引用传参:你可以理解为每次都把变量本身真实的传进去了,不管是个像int a这种引用地址的变量,还是像Integer a1这种引用对象的变量

猜你喜欢

转载自blog.csdn.net/u012309392/article/details/83443679