zoukankan      html  css  js  c++  java
  • 以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习惯了,所以觉得操作了一个引用就可以修改对象里的值

    当我执行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中不可能的

    引用传参:你可以理解为每次都把变量本身真实的传进去了,不管是个像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);
    }

  • 相关阅读:
    jdk7_ConcurrentHashMap 图示
    Teradata 日期函数
    Teradata正则表达式
    Teradata sql去除字段中的字母/数字
    sql查询连续3天有交易记录的客户
    批量生成sql查询语句
    sql查询字段中是否含有字母/数字/符号
    sql查询每个人最新的2个电话号码
    python连接Teradata数据库
    dos命令获取文件行数
  • 原文地址:https://www.cnblogs.com/zhaoyan001/p/11613066.html
Copyright © 2011-2022 走看看