首页 / JAVA / java引用传递和值传递
java引用传递和值传递
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java引用传递和值传递,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2046字,纯文字阅读大概需要3分钟。
内容图文
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,
有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑。
关于值传递和引用传递其实需要分情况看待,今天学习和分析一下,着急可以先看最后的结论。
1.基本类型和引用类型在内存中的保存
Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。
基本类型的变量保存原始值,即它代表的值就是数值本身;
而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,
对象本身存放在这个引用值所表示的地址的位置。
基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,
引用类型包括:类类型,接口类型和数组。
相应的,变量也有两种类型:基本类型和引用类型。
2.引用传递和值传递
这里要用实际参数和形式参数的概念来帮助理解,
值传递:
方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
引用传递:
也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。
看一个例子:
1 public static void a(int a) { 2 a++; 3 System.out.println(a); 4 } 5 6publicstaticvoid a(myInt a) { 7 a.a++; 8 System.out.println(a.a); 9 } 1011class myInt { 12int a = 1; 13 } 1415publicstaticvoid main(String[] args) { 16int a = 1; 17 myInt b = new Test().new myInt(); 18 a(a); 19 System.out.println(a); 20 a(b); 21 System.out.println(b.a); 22 }
这里的输出是:2,1,2,2.这里看到int类型变量的值没有改变,而类对象的值则改变了,前者是值传递,后者是引用传递.
这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,
因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待,可以认为是和基本数据类型相似,传值操作。
看下面的例子:
1 public static void change(String a){ 2 a+="World"; 3 } 4 5publicstaticvoid change(StringBuffer a){ 6 a.append("World"); 7 } 8 9publicstaticvoid change(StringBuilder a){ 10 a.append("World"); 11 } 1213publicstaticvoid main(String[] args) { 14 String a="Hello"; 15 StringBuffer b=new StringBuffer("Hello"); 16 StringBuilder c=new StringBuilder("Hello"); 17 change(a); 18 System.out.println(a); 19 change(b); 20 System.out.println(b); 21 change(c); 22 System.out.println(c); 23 }
这里输出的结果Hello,HelloWorld,HelloWorld.由此可见,String是重新生成了一个对象,StringBuff和Stingbuilder是引用传递
3.结论
结合上面的分析,关于值传递和引用传递可以得出这样的结论:
(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。
转自https://www.cnblogs.com/binyue/p/3862276.html 略有修改
原文:https://www.cnblogs.com/ouhaitao/p/8611519.html
内容总结
以上是互联网集市为您收集整理的java引用传递和值传递全部内容,希望文章能够帮你解决java引用传递和值传递所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。