java 一个代码问题

[code="java"]

package com;

public class UserTest
{
public static void main(String[] args){
User u = new User("jack");
UserTest ut = new UserTest();
ut.changeUser(u);
System.out.println(u.getName());
}
private void changeUser(User u){
u = new User("tom");
System.out.println(u.getName());
}
}

package com;

public class User
{
public User(String name){
this.name = name;
}
private String name;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
[/code]

请先思考一下输出的内容。

程序运行的结果是:
tom
jack

我的疑问:为何不是
tom

chageUser执行完毕后,User.tom占用内存应该释放。此时U的指针应该执行空。

其实,这个是关于java中传值还是引用的问题

private void changeUser(User u) 传递的是值,也就是u对象指针的一个值,所以你在函数中改变这个值是没有用的,它只是一个u的值的一个副本

    // u是指向堆中对象的一个指针值
    User u = new User("jack");  
    // u的值被复制一份,传递给方法中的参数 
    private void changeUser(User u){
        // u的副本值被改变,但是并不影响u本身的值  
        u = new User("tom");  
       System.out.println(u.getName());  
    } 

在java中一切都是值传递

对象存储在堆中,
USer u 变量指向了两个对象
我想在changeUser方法域中指向 tom对象 ,释放的问题请查 java CG :D