日期:2014-05-20  浏览次数:20594 次

诸位高手请进,请为小弟解惑
如下:User类
Java code

public class User
{
    private String name;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
    
    
}




测试类:
Java code

public class test
{
    private static String s;
    
    public void set(User u){
        User u1 = new User();
        u1.setName("32");
        [color=#FF0000]u = u1;[/color]
    }
    public static void main(String[] args)
    {
        User u =new User();
        test t = new test();
        t.set(u);
        System.out.println(u.getName());
    }
}





运行结果为: null
//如果上面红色的地方换为:u.setName("32");那么打印结果对应为“32”,这个可以理解。
因为操作的是引用。
可是打印null的是什么原因?个人认为,new 了一个对象u1,此时u=u1是把u1的引用赋给了u,那么此时u指向u1所指向的对象,那么答应结果也应该为32啊。难道在u=u1时,新产生了一个引用,并且原来的u引用被垃圾回收?


跪求解答。



------解决方案--------------------
Java code

public void set(User u){
        User u1 = new User();
        u1.setName("32");
        u = u1;
    }

------解决方案--------------------
就像你说的,是把外面的User对象引用传给set 方法的User对象了。二者指向一个地址,但二者还是二个不同对象。
所以在set方法中,u = u1 只影响方法内的对象,main方法中的还是指向原来的地址。所以其name值还是空。

至于如果执行u.setName("32");因为set方法内外二个对象是指向同一个地址,所以就等于main方法中那个对象的name值改变了,所以输出32。没什么不好理解的。

------解决方案--------------------
楼主对java的参数传递不是太理解,对于对象,Java传递的是一个引用。看下面在代码上的注释吧。
Java code

public class test
{
    private static String s;
    
    public void set(User u){//接收到传过来的参数地址00000001,在函数中以一个变量u来存储这个地址
        User u1 = new User();新建一个User,在内存中开辟一段空间存储,假设地址为:00000003
        u1.setName("32");//给u1的name赋值,即地址为00000003的空间内的name为32
        u = u1;//u=u1,此时将变量u的值改为了00000003,仅仅改变的是函数中的变量值
         //若在此后执行System.out.println(u.getName());必定得到32
        //函数执行完毕,没有返回值。返回到主函数执行最后一句pringln

    }
    public static void main(String[] args)
    {
        User u =new User();//新建一个User,在内存中开辟一段空间存储,假设地址为:00000001
        test t = new test();//新建一个Test,在内存中开辟一段空间存储,假设地址为:00000002
        t.set(u);//执行Test的set函数,此是所传参数为u的引用,即其地址00000001
        System.out.println(u.getName());//此时的u的地址仍为上面创建的地址00000001    }
}