一道简单的面试题

面试的时候遇到了 这样一个面试题。 对基础的一知半解,把自己带到坑里面了

 

代码如下  问运行的结果

 

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里面的传值都是传递 引用地址的。 一看这道题。 哎呦,想考我这点,soeasy 大笔一挥 写了个 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



 

 

执行完毕。 释放空间,就变成下图了。

 



 

 

 

 

 

 

猜你喜欢

转载自pdnev.iteye.com/blog/2397236