最近在写代码的时候出了一个错误,因为对值引用理解的不深,将Integer传入方法中修改,觉得传入后直接修改Integer中的值就不用写返回值接收了,虽然很快发现了问题,但仍是来总结一下spa
首先是代码:code
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习惯了,因此以为操做了一个引用就能够修改对象里的值blog
当我执行var = 10 的值之后,因为jdk1.5自动装箱的特性,实际状况是等价于执行 var = Integer.valueOf(10);源码
valueOf()方法 参看源码 会根据传入的数值 若是在-128-127之间 就从常量池中获取一个Integer对象返回class
若是不在范围内 会new Integer(var)返回变量
那么执行 var = 10之后
jdk
当时我天真的觉得是操做了那个5变成了10date
好了 ,这两张图已经足够说明Java传参为何是值传参而不是引用传参了引用
总结一下:
值传参:将传入的值拷贝一份 ,好比传入int a = 5,并不会将变量a的地址传给方法
又或者传入对象类型Integer a1 =5 ,a1自己是个引用,传入方法后不会直接将a1这个引用传入,而是从新复制一份引用到方法参数中 ,有点绕 不理解? 想一下若是是将a1真实的传入上述的方法中,那就变成a1 = new Integer(10) ,结果就不同了,变成下图所示,固然这是在JAVA中不可能的
引用传参:你能够理解为每次都把变量自己真实的传进去了,无论是个像int a这种引用地址的变量,仍是像Integer a1这种引用对象的变量
public static void main(String[] 参数) { AtomicInteger i=new AtomicInteger(40); i.intValue(); System.out.println(i); } public static void change(AtomicInteger i) { i.set(55);}