不是危言耸听,这道题很多人都做错,其中很多是资深开发人员。

请问下面程序运行后输出什么:
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方法传参的问题相关推荐

  1. 程序员必看,学习的方法

    程序员必看,学习的方法 0.引言 在学习编程语言的路上,发现初学者(包括俺)问 得最多的问题莫过于"如何学习编程?Java该如何学习?".类似的问题回答多了,难免会感觉厌烦,就萌生 ...

  2. 作为一个新手程序员该如何成长

    今天在Java那些事上看到一篇文章叫<作为一个新手程序员该如何成长>,我觉得深受启发,特总结在这里. 1,找一种你喜欢用到工作中的语言. 我喜欢Java,可能是因为一开始学习的时候体会到很 ...

  3. 初级程序员经常犯的10种错误,网友:工作几年了都还在犯

    初级程序员经常犯的10种错误,网友:工作几年了都还在犯 小编在网上经常容易看见#程序员如何升职#.#程序员的进阶之路#这样的话题,于是我整理了一些网上的资料并结合自己的经验,梳理出了10种初级程序员经 ...

  4. TCP粘包:我只是犯了每个数据包都会犯的错 |硬核图解

    事情从一个健身教练说起吧. 李东,自称亚健康终结者,尝试使用互联网+的模式拓展自己的业务.在某款新开发的聊天软件琛琛上发布广告. 键盘说来就来.疯狂发送"李东",回车发送!,&qu ...

  5. Python程序员常犯的十个错误

    不管是在学习还是工作过程中,人都会犯错.虽然Python的语法简单.灵活,但也一样存在一些不小的坑,一不小心,不管是初学者还是资深Python程序员都有可能会栽跟头. 常见错误1:错误地将表达式作为函 ...

  6. 一个老程序员在情人节对中国软件业的致言!(转)

    一些人总是发出一些错误的声音,形成了劣胜优汰可怕的现象.他们在误导着中国,把 我们的后继军训练成 软件蓝领――――胸无大志,目光短浅,稍有点成绩就自满就自高自大的人,浑不知天外有 天,外国正在虎视眈 ...

  7. 是非人生——一个菜鸟程序员的5年人生路

    注意:!!!!!!!!!!!! 文章可能还在连载.请关注: http://topic.csdn.net/u/20080318/10/e4543fc2-d726-465c-bc95-fea14b92db ...

  8. 是非人生 — 一个菜鸟程序员的5年职场路 第28节

    是非人生 - 一个菜鸟程序员的5年职场路第28节作者: 花8 天涯IT: http://cache.tianya.cn/publicforum/content/itinfo/1/77229.shtml ...

  9. 是非人生 — 一个菜鸟程序员的5年职场路 第20节

    是非人生 - 一个菜鸟程序员的5年职场路第20节作者: 花8 天涯IT: http://cache.tianya.cn/publicforum/content/itinfo/1/77229.shtml ...

最新文章

  1. gulp压缩js转义es6的常见错误及解决方案
  2. Android实现炫酷的星空变幻效果
  3. 利用matlab对rosbag数据,通过matlab提取rosbag数据
  4. scala函数的定义语法说明
  5. Fragment与Activity交互(使用接口)
  6. 前端学习(3073):vue+element今日头条管理-删除文章失败(配合axios使用)
  7. Java工作笔记-类型转换的一种思路(前后端分离、反射)
  8. loadrunner java_如何使用LoadRunner开发JAVA Vuser
  9. Linux DMA Engine framework(3)_dma controller驱动
  10. 【IOS】ios8推送消息注册
  11. (转)C++ 库汇总(网址+简介)
  12. RocketMQ开发指导之四——RocketMQ常见问题
  13. iOS开发之超级签名-原理/机制/技术细节-完全解析(暂时还没有验证)
  14. 使用ThinkPHP扩展,实现Redis的CURD操作。
  15. 两个不同包里有相同的类
  16. Java语言的特点有哪些?有什么作用?
  17. Eureka 服务注册中心的探究
  18. gnuplot命令大全
  19. 快传号视频批量上传,禁止转载!
  20. word固定上方菜单栏

热门文章

  1. dump文件类型与dump文件生成方法详解
  2. 百度爱番番实时CDP平台架构实践
  3. office和操作系统正版序列号
  4. 虚拟物品交易 一盘大生意
  5. Android T startingwindow流程梳理
  6. UML基础(附绘制教程)
  7. Win7 xp 双系统安装说明(转)
  8. Linux中bash下三种引号的作用(双引号,单引号,反引号)
  9. Brackets 编辑器 12 个有用的扩展插件
  10. 互联网生意秘诀之明风社