面试的时候遇到了 这样一个面试题。 对基础的一知半解,把自己带到坑里面了
代码如下 问运行的结果
public void test(){
Member m = new Member();
m.setName("abc");
update(m);
System.out.println(m.getName());
}
public void update(Member m){
m = new Member();
m.setName("xyz");
}
以前知道,java里面的传值都是传递 引用地址的。 一看这道题。 哎呦,想考我这点,so,easy 大笔一挥 写了个 xyz。 后开想着好像有点不对。回来测试了一下,果然是自己2了。实际运行的结果是 abc 。解释如下。
Member m = new Member();
m.setName(“abc”);
这个时候内存中 ,创建了一个 变量m ,创建了 一个member, 里面有name 指向 “abc” , m的地址指向member
执行update(m)
这时候, 又创建了一个变量m (便于区分,叫m-x),它也指向了 member。 注意这个m-x 和 m不是一个变量。 只是目前他们指向的是同一个member
然后就是执行update代码
Update{ m = new Member();m.setName(“xyz”)}
先说 m= new Member(). 这个时候首先内存中会开辟一块空间,里面放一个member(便于区分,后面称为member-x)。 然后将 m-x的地址指向member-x; 我错就错在这个地方。注意的是m-x指向了member-x, 而原始的m 仍然指向member。
接下来 m.setName(“xyz”),这时候操作的就是m-x了,没多少说的。 将member-x中的name指向 “xyz”. 方法执行完毕。 释放内存空间,这个时候m-x 和member-x 都会被销毁(具体什么时间销毁看人品了,丑的马上被GC干掉,帅的能苟活一阵)。
然后剩下的就会这些了。 答案是 “abc”
联想到下一个问题
Update{
m.setName(“xyz”);
m = new Member();
}
这个时候答案了? 接着这张图。
m.setName(“xyz”) 。 执行这个代码的时候 m-x 仍然指向的是 member。 所以改变的是 member 里面的值。
m = new Memer(); 执行这行代码以后, 新建了一个member-x;m-x 指向member-x。
执行完毕。 释放空间,就变成下图了。