一个多数程序员都会犯的错:Java方法传参的问题
2017-04-26 11:36
507 查看
不是危言耸听,这道题很多人都做错,其中很多是资深开发人员。
请问下面程序运行后输出什么:
A、老唐 B、令狐冲 C、杨过 D、郭靖
答案是: B、令狐冲
你答对了吗?
关键就在member=me这里:在java中,给对象赋值是传递的对象地址(指针变量)!
因此member=me就让member和me指向了同一个对象,操作member相当于操作me。
当执行
相当于执行
就是在这里,me对象变成了令狐冲了
接下来创建了一个对象member_other,然后调用
这一句让member和member_other指向了同一个对象,操作member相当于操作member_other
所以这时执行
相当于执行
然后方法结束,局部变量member,member_other被销毁
最终me就是令狐冲
不啰嗦,看下图理解:
其关键是认为在方法内部调用
这实际上理解的最大误区就在于:认为方法形参向实参传递时,是传递了指针的指针。
不过,在有些情况下如果你想做到方法形参的任何改变,都会影响实参,那确实就必须要传递指针的指针。
请问下面程序运行后输出什么:
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; } @Override public 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。
这实际上理解的最大误区就在于:认为方法形参向实参传递时,是传递了指针的指针。
不过,在有些情况下如果你想做到方法形参的任何改变,都会影响实参,那确实就必须要传递指针的指针。
方法参数传递指针的指针的情况
见图解:相关文章推荐
- 一个让98%的Java程序员犯难的偏门问题!
- 学习Java的第一步是安装好JDK,写一个Hello World, 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加
- java如何监控一个方法的运行时间 [问题点数
- 如何实现多个线程同步 (2013-11-10 12:07:24)转载▼ 标签: it 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多
- JAVA学习中,一个关于Object对象转换时对应方法的问题
- 一个让98%的Java程序员犯难的偏门问题!
- Java 泛型 集合引用赋值问题(或方法传参)
- java中,多个线程同时调用同一个静态方法的问题
- 使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
- java中ArrayList的remove方法删除一个数据时问题简述
- java中遇到的一个问题及解决方法
- java方法重写的时候,一个调用父类还是子类方法的问题
- java基础问题----java中有几种方法可以实现一个线
- 使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
- 一个让98%的Java程序员犯难的偏门问题!
- 使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
- java调用linux top命令的方法,以及遇到的一个问题
- 使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
- 待补充:java类里的私有变量问题,在对象A里有一个对象B,调用对象B的方法获取变量,会有短暂的缓存
- 关于Java构造方法的一个问题