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

最近在写代码的时候出了一个错误,因为对值引用理解的不深,将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);}

相关文章
相关标签/搜索