java到底是值传递还是java 对象引用传递递

博客分类:
Map&String, Object& map = new HashMap&String, Object&();
Map&String, String& params = new HashMap&String, String&();
map.put("params", params);
params.put("key", key);
Map的put不是put一个对象,而是put一个对象的引用!该对象更新后,Map里面被put的引用随着改变。
对于String,我用代码测试了一下:
String a = new String("111");
String b =
a = "222";
System.out.println(b);//结果是111
System.out.println(b.equals(a));//false
测试结果是b仍然为111。
String b =表示a和b指向同一个字符串"111"的引用。
a = "222";表示把a改变为指向"222"的应用,而此时b保持不变。
再看Sting数组
String a[] = { "1","2","3" },
String b[] =
a[0] = "4";
System.out.println(b[0]); //结果是4
System.out.println(b.equals(a));//true
此时输出的又是4!这个跟上面的Map类似。
此时在方法中把对象(或数组)作为参数,方法调用时,参数传递的是对象的引用(地址),这时候b与a指向同一个内存地址,即同一个对象(数组),改变数组a的值的时候,也就相当于改变了b的值。
引用Java对对象和基本的数据类型的处理是不一样的。和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。
而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。
除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。
浏览 10070
浏览: 433339 次
来自: 杭州
写的太好了,通俗易懂。
逻辑好清晰,学习了,感谢分享!
文章写的不错,不过还有一些东西没有讲解到。可以看这篇文章:Ht ...
博主,可以注释一下吗?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Java面试题:值传递和引用传递
在当今的互联网大军中,不少人顺应时代潮流,选择了Java开发作为自己的发展方向,进行。今天,的老师给大家分享一下:值传递和引用传递(更多相关推荐:)
对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。
对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。
官方微信更多精彩,扫码关注 或微信搜索:ujiuye
官方微博更多精彩,扫码关注 或微博搜索:优就业
注:本站稿件未经许可不得转载,转载请保留出处及源文件地址。
(责任编辑:zhangjs)
关键词阅读
免费声明:本站所提供真题均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用,不涉及商业盈利目的。如涉及版权问题,请联系本站管理员予以更改或删除。
优就业官方微信扫描二维码,即可与小U亲密互动
优就业官方QQ号
咨询电话(09:00-22:00)400-650-7353
IT培训友情链接
|||||||||||||||||||||||||||||||||||||
(点击一键加群)Java到底是传引用还是传值? - ImportNew
问题: 如果Java是用引用来传递的话,为什么交换函数(swap)不起作用呢?
回答: 你的问题引出了Java新手的常犯的错误。事实上,一些老手也很难搞清楚这些概念。
Java确实使用对象的引用来做计算的,所有的对象变量都是引用。但是,Java在向方法传递参数时传的不是引用,是值。
以 badSwap() 函数为例:
public void badSwap(int var1, int var2)
int temp = var1;
var1 = var2;
当badSwap方法返回时,被当作参数传入的变量仍然保持了原来的值不变。如果我们把传入的int型变量改为Object型也是一样的,因为Java通过传值来传递引用的。现在,我们来看下是哪个地方搞的鬼:
public void tricky(Point arg1, Point arg2)
arg1.x = 100;
arg1.y = 100;
Point temp = arg1;
arg1 = arg2;
public static void main(String [] args)
Point pnt1 = new Point(0,0);
Point pnt2 = new Point(0,0);
System.out.println(&X: & + pnt1.x + & Y: & +pnt1.y);
System.out.println(&X: & + pnt2.x + & Y: & +pnt2.y);
System.out.println(& &);
tricky(pnt1,pnt2);
System.out.println(&X: & + pnt1.x + & Y:& + pnt1.y);
System.out.println(&X: & + pnt2.x + & Y: & +pnt2.y);
执行这个函数,将得到以下输出:
———————————————————-
X: 100 Y: 100
———————————————————-
即使是通过值传递,tricky函数依然成功地改变了pnt1的值。但是pnt1和pnt2的置换失败了。这正是最令人困惑的地方。在main()函数当中,pnt1和pnt2仅仅是对象的引用。当你向tricky()函数传递pnt1和pnt2参数时,Java仅仅向传递任何其他参数一样,通过传值来传递引用。这就意味着:传向函数的引用实际上是原始引用的副本。下面的图一展现了当Java传递对象给函数之后,两个引用指向了同一对象
图一: 当被传递给函数之后,一个对象至少存在两个引用
Java复制并传递了“引用”的值,而不是对象。因此,方法中对对象的计算是会起作用的,因为引用指向了原来的对象。但是因为方法中对象的引用是“副本”,所以对象交换就没起作用。如图2所示,交换动作只对方法中的引用副本起作用了,不影响方法外的引用。所以不好意思,方法被调用后,改变不了方法外的对象的引用。如果要对方法外的对象引用做交换,我们应该交换原始的引用,而不是它的副本。
图二: 只有传入函数的引用交换了,原始引用则没有
英文出处:
感谢新浪微博:
翻译本文。
译文链接:
【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】
关于作者:
标注为 "ImportNew读者" 发布的文章,均为热心读者的投稿。感谢支持!
可能感兴趣的文章
Hi,请到伯乐在线的小组发帖提问,支持微信登录。链接是: http://group.jobbole....
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2017 ImportNew&&&&&&& 鈶犳}

我要回帖

更多关于 java参数引用传递 int 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信