Java包装类作为参数传递

今天在回顾Java基础的时候发现了这么几行代码:

    public static void passReferenceValue(Boolean flg, Integer num) {flg = true;num = 10;}public static void main(String[] args) {Boolean a = false;Integer b = 5;System.out.println("a : " + a + " b : " + b);passReferenceValue(a, b);System.out.println("a : " + a + " b : " + b);}

猜测结果:

a : false b : 5

a : true b : 10

实际结果:

a : false b : 5

a : false b : 5

我认为在java中包装类被传入方法中是引用传递,所以在方法中对包装类的值进行修改后其会改变,但是实际上的结果却和基本类型值传递是一样的效果。

我们都知道,上述方法中的修改过程涉及到了自动装箱和拆箱

自动装箱就是Java自动将原始类型值转换成对应的包装类型,如将int的变量转换成Integer对象,这个过程叫做装箱。反之将Integer引用类型转换成int类型值,这个过程叫做拆箱。因为装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。

基本数据类型:byte,short,char,int,long,float,double、boolean
对应的封装类为:Byte,Short,Character,Integer,Long,Float,Double,Boolean

自动装箱时编译器调用valueOf将基本类型值转换成引用类型。
自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。

所以来到Integer包装类的源码,我们很快定位到valueOf()方法:

    public static Integer valueOf(String s, int radix) throws NumberFormatException {return Integer.valueOf(parseInt(s,radix));}

上述的parseInt()方法为 public static int parseInt(String s, int radix) throws NumberFormatException,很明显其返回了int数值。

然后我们定位到return后的Interger.valueOf()方法:

    public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}

最终发现是Interger.valueOf()返回了一个new出来的对象 —— 新Integer造成了

num = 10;

成为了

num = new Integer(...);

方法中改变引用对象的地址后是不会改变原有对象所指向的地址的。

到这里,我想大家已经明白了包装类作为参数传递在方法中修改为什么其值没有被修改,这是因为在自动装箱和拆箱的过程中原来的赋值被替换为了新的对象。

那么有的小伙伴可能想问,那么Boolean呢。

     public static Boolean valueOf(boolean b) {return (b ? TRUE : FALSE);}

这个TRUE不是我们迫使所认为的true,而是指:

public final class Boolean implements java.io.Serializable,Comparable<Boolean>
{/*** The {@code Boolean} object corresponding to the primitive* value {@code true}.*/public static final Boolean TRUE = new Boolean(true);...

没错,这个TRUE是一个Boolean对象,FALSE也是一样,这就是为什么一开始的代码中方法对传入包装类赋值失败的原因。

Java包装类作为参数传递相关推荐

  1. 【Java】探究Java方法的参数传递是值传递还是引用传递

    测试思路 每个更改形参的方法,返回值都是void,不同方法的参数设置不同类型. 注意在方法内测地址的时候在改之前测一下,才能看出传入参数是不是传了地址.(注意反正OS的内存地址是虚拟的,JVM中的也是 ...

  2. 近7000字长文详细讲解Java包装类,面试稳了

    零基础学习之Java包装类 概述 基本介绍 包装类的使用 装箱 介绍 代码示例 拆箱 介绍 代码示例 包装类常见的API 基本数据类型和字符串之间的转换 数据类型的最大值和最小值 转大小写 转进制 包 ...

  3. 14.Java包装类

    转载请保留原文链接: http://dashidan.com/article/java/basic/14.html 14.Java包装类 Java语言是一个面向对象的语言,但Java中的基本数据类型却 ...

  4. Java基础之参数传递

    Java基础之参数传递 本文目录 Java值传递还是引用传递? 案例演示 1. Java值传递还是引用传递? 实际上java参数传递只有一种情况,那就是值传递.所不同的是,一般说的"引用传递 ...

  5. Java包装类与基本数据类型的自动 手动装箱与自动 手动拆箱

    Java包装类与基本数据类型的自动 手动装箱与自动 手动拆箱 **自动装箱与拆箱**,实现代码如下: /*** 装箱 : 基本数据类型-----> 包装类* 拆箱: 包装类-------> ...

  6. java+包装类,装箱和拆箱_Java包装类,装箱和拆箱详解

    下面要给大家讲到的就是Java内置包装类方面的知识,这章主要会讲到Java包装类装箱和拆箱方面的知识,一起来了解一下. Java为每种基本数据类型分别设计了对应的类,这就被叫做是包装类(Wrapper ...

  7. educoder实训平台java入门_educoder上的实训题目(学习-Java包装类之Byte类)

    学习-Java包装类之Byte类 编程要求 仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中完成 Byte 类与基本数据类型之间的转换,具体要求如下: 获取键盘第一次输入的 byt ...

  8. java函数的参数传递

    java的函数参数传递 参数传递 java是:值传递(直接复制一个副本) 对于基础数据类型,直接复制新的对应基础类型数据. 对于引用类型,复制的是对象的引用.在不改变对象引用的情况下改变形参的成员变量 ...

  9. Java包装类及自动装箱、拆箱

    Java包装类 基本类型 大小 包装器类型 boolean / Boolean char 16bit Character byte 8bit Byte short /16bit Short int 3 ...

最新文章

  1. 计算机二级c真题108套,2016年计算机二级108套程序.docx
  2. 大话中文文本分类之前数据处理
  3. Html转义字符列表
  4. 程序世界的秘密(下)(完)
  5. python matplotlib pyplot plt.axhline()函数(绘制平行于x轴的水平参考线)
  6. php odbc连接sqlserver,php pdo连接sqlserver配置
  7. OptaPlanner –具有真实道路距离的车辆路线
  8. 10款Flash和Javascript网页音乐播放器
  9. Qt下实现多线程串口通信
  10. px2rem-loader(Vue:移动端自适应,px自动转化)
  11. 王小九用计算机弹桥边姑娘,抖音最火歌曲是哪首?QQ音乐开放平台《桥边姑娘》让“野狼”靠边站...
  12. CSGO常用地图实体列表
  13. git 不abandon的办法
  14. JVM、DVM(Dalvik VM)和ART虚拟机的区别
  15. 你认识5G物联网关键器件FBG吗
  16. C++ Reference: Standard C++ Library reference: C Library: cmath: cosh
  17. LOAM源码解析1一scanRegistration
  18. matlab中的measure,关于matlab中awgn函数中参数作用的测试
  19. 首次跌至发行价的Snap,要如何抵抗社交巨头Facebook的抄袭?
  20. Python函数知识总结

热门文章

  1. 精美到无可挑剔的几首古典音乐
  2. Flink部署——细粒度资源管理
  3. 怎样在ipad上显示pc_如何将iPad用作PC或Mac的辅助显示器
  4. 计算机病毒与网络安全的小报,校园网络安全手抄报图片
  5. Golang 数据库操作
  6. Scrapy 实例——爬取豆瓣图书排名top250
  7. 《大数据日知录》读书笔记-ch2数据复制与一致性
  8. 刘宇翔第一次作业的一些总结
  9. Spring三种方法的注解自动注入
  10. sublime如何运行HTML