一个多数程序员都会犯的错:Java方法传参的问题
不是危言耸听,这道题很多人都做错,其中很多是资深开发人员。
请问下面程序运行后输出什么:
A、老唐 B、令狐冲 C、杨过 D、郭靖
public class Test {public static void main(String[] args) throws Exception {Member me = new Member();me.setId(1);me.setName("老唐");chuanyue(me);System.out.println(me);}// 方法chuanyue,即:穿越public static void chuanyue(Member member) {member.setId(1001);member.setName("令狐冲");Member member_other = new Member();member_other.setId(1002);member_other.setName("杨过");member = member_other;member.setId(1003);member.setName("郭靖");}}class Member {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Member [id=" + id + ", name=" + name + "]";}}
答案是: B、令狐冲
你答对了吗?
分析:
当我们调用chuanyue(me)时,函数内部会做一个隐式操作:member=me;
关键就在member=me这里:在java中,给对象赋值是传递的对象地址(指针变量)!
因此member=me就让member和me指向了同一个对象,操作member相当于操作me。
当执行
member.setId(1001);
member.setName("令狐冲");
相当于执行
me.setId(1001);
me.setName("令狐冲");
就是在这里,me对象变成了令狐冲了
接下来创建了一个对象member_other,然后调用
member = member_other;
这一句让member和member_other指向了同一个对象,操作member相当于操作member_other
所以这时执行
member.setId(1003);
member.setName("郭靖");
相当于执行
member_other.setId(1003);
member_other.setName("郭靖");
然后方法结束,局部变量member,member_other被销毁
最终me就是令狐冲
不啰嗦,看下图理解:
指针的指针
我问有些回答错误的人,他们大多数答案是 D、郭靖。
其关键是认为在方法内部调用member = member_other;
时,会让me也指向member_other。简单的说,他们认为member的一切改变都会影响me。
这实际上理解的最大误区就在于:认为方法形参向实参传递时,是传递了指针的指针。
不过,在有些情况下如果你想做到方法形参的任何改变,都会影响实参,那确实就必须要传递指针的指针。
方法参数传递指针的指针的情况
见图解:
一个多数程序员都会犯的错:Java方法传参的问题相关推荐
- 程序员必看,学习的方法
程序员必看,学习的方法 0.引言 在学习编程语言的路上,发现初学者(包括俺)问 得最多的问题莫过于"如何学习编程?Java该如何学习?".类似的问题回答多了,难免会感觉厌烦,就萌生 ...
- 作为一个新手程序员该如何成长
今天在Java那些事上看到一篇文章叫<作为一个新手程序员该如何成长>,我觉得深受启发,特总结在这里. 1,找一种你喜欢用到工作中的语言. 我喜欢Java,可能是因为一开始学习的时候体会到很 ...
- 初级程序员经常犯的10种错误,网友:工作几年了都还在犯
初级程序员经常犯的10种错误,网友:工作几年了都还在犯 小编在网上经常容易看见#程序员如何升职#.#程序员的进阶之路#这样的话题,于是我整理了一些网上的资料并结合自己的经验,梳理出了10种初级程序员经 ...
- TCP粘包:我只是犯了每个数据包都会犯的错 |硬核图解
事情从一个健身教练说起吧. 李东,自称亚健康终结者,尝试使用互联网+的模式拓展自己的业务.在某款新开发的聊天软件琛琛上发布广告. 键盘说来就来.疯狂发送"李东",回车发送!,&qu ...
- Python程序员常犯的十个错误
不管是在学习还是工作过程中,人都会犯错.虽然Python的语法简单.灵活,但也一样存在一些不小的坑,一不小心,不管是初学者还是资深Python程序员都有可能会栽跟头. 常见错误1:错误地将表达式作为函 ...
- 一个老程序员在情人节对中国软件业的致言!(转)
一些人总是发出一些错误的声音,形成了劣胜优汰可怕的现象.他们在误导着中国,把 我们的后继军训练成 软件蓝领――――胸无大志,目光短浅,稍有点成绩就自满就自高自大的人,浑不知天外有 天,外国正在虎视眈 ...
- 是非人生——一个菜鸟程序员的5年人生路
注意:!!!!!!!!!!!! 文章可能还在连载.请关注: http://topic.csdn.net/u/20080318/10/e4543fc2-d726-465c-bc95-fea14b92db ...
- 是非人生 — 一个菜鸟程序员的5年职场路 第28节
是非人生 - 一个菜鸟程序员的5年职场路第28节作者: 花8 天涯IT: http://cache.tianya.cn/publicforum/content/itinfo/1/77229.shtml ...
- 是非人生 — 一个菜鸟程序员的5年职场路 第20节
是非人生 - 一个菜鸟程序员的5年职场路第20节作者: 花8 天涯IT: http://cache.tianya.cn/publicforum/content/itinfo/1/77229.shtml ...
最新文章
- gulp压缩js转义es6的常见错误及解决方案
- Android实现炫酷的星空变幻效果
- 利用matlab对rosbag数据,通过matlab提取rosbag数据
- scala函数的定义语法说明
- Fragment与Activity交互(使用接口)
- 前端学习(3073):vue+element今日头条管理-删除文章失败(配合axios使用)
- Java工作笔记-类型转换的一种思路(前后端分离、反射)
- loadrunner java_如何使用LoadRunner开发JAVA Vuser
- Linux DMA Engine framework(3)_dma controller驱动
- 【IOS】ios8推送消息注册
- (转)C++ 库汇总(网址+简介)
- RocketMQ开发指导之四——RocketMQ常见问题
- iOS开发之超级签名-原理/机制/技术细节-完全解析(暂时还没有验证)
- 使用ThinkPHP扩展,实现Redis的CURD操作。
- 两个不同包里有相同的类
- Java语言的特点有哪些?有什么作用?
- Eureka 服务注册中心的探究
- gnuplot命令大全
- 快传号视频批量上传,禁止转载!
- word固定上方菜单栏