Java中值传递和引用传递
目录介绍
- 01.基本类型和引用类型
- 02.什么是值传递
- 03.什么是引用传递
- 04.通过案例分析
- 05.案例过程分析
- 06.得出的结论
好消息
- 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢!
- 链接地址:https://github.com/yangchong211/YCBlogs
- 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!
01.基本类型和引用类型
- Java中的数据类型分为两种为基本类型和引用类型。
- 1、基本类型的变量保存原始值,所以变量就是数据本身。
- 常见的基本类型:byte,short,int,long,char,float,double,Boolean,returnAddress。
- 2、引用类型的变量保存引用值,所谓的引用值就是对象所在内存空间的“首地址值”,通过对这个引用值来操作对象。
- 常见的引用类型:类类型,接口类型和数组。
- 1、基本类型的变量保存原始值,所以变量就是数据本身。
- 基本类型(primitive types)
- primitive types 包括boolean类型以及数值类型(numeric types)。numeric types又分为整型(integer types)和浮点型(floating-point type)。整型有5种:byte short int long char(char本质上是一种特殊的int)。浮点类型有float和double。
- 引用类型(reference types)
- ①接口 ②类 ③数组
02.什么是值传递
- 在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。
- 比如String类,设计成不可变的,所以每次赋值都是重新创建一个新的对象,因此是值传递!
03.什么是引用传递
- 引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间。
- 引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。
- 在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。
04.通过案例分析
- 看下面代码案例
private void test1(){ Demo demo = new Demo(); demo.change(demo.str, demo.ch); Log.d("yc---",demo.str); Log.d("yc---", Arrays.toString(demo.ch)); //打印值 //yc---: hello //yc---: [c, b] } public class Demo { String str = new String("hello"); char[] ch = {'a', 'b'}; public void change(String str, char[] ch) { str = "ok"; ch[0] = 'c'; } }
05.案例过程分析
- 为对象分配空间
- 执行change()方法
- 执行前实参(黑色)和形参(红色)的指向如下:
- 最后打印
- 因为String是不可变类且为值传递,而ch[]是引用传递,所以方法中的str = “ok”,相当于重新创建一个对象并没有改变实参str的值,数组是引用传递,直接改变,所以执行完方法后,指向关系如下:
06.得出的结论
- 通过上面的分析我们可以得出以下结论:
- 基本数据类型传值,对形参的修改不会影响实参;
- 引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。
- String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。
- 如何理解引用类型的按值传递?
- 引用类型的按值传递,传递的是对象的地址。只是得到元素的地址值,并没有复制元素。比如数组,就是引用传递,假如说是值传递,那么在方法调用赋值中,将实参的值复制一份传递到函数中将会非常影响效率。
其他介绍
01.关于博客汇总链接
02.关于我的博客
- 我的个人站点:www.yczbj.org,www.ycbjie.cn
- github:https://github.com/yangchong211
- 知乎:https://www.zhihu.com/people/yczbj/activities
- 简书:http://www.jianshu.com/u/b7b2c6ed9284
- csdn:http://my.csdn.net/m0_37700275
- 喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/
- 开源中国:https://my.oschina.net/zbj1618/blog
- 泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
- 邮箱:[email protected]
- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
- segmentfault头条:https://segmentfault.com/u/xiangjianyu/articles
- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e