如下:User类public class User
{
private String name; public String getName()
    {
     return name;
    } public void setName(String name)
    {
     this.name = name;
    }


}测试类:public class test
{
private static String s;

public void set(User u){
User u1 = new User();
u1.setName("32");
u = u1;
}
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引用被垃圾回收?
跪求解答。

解决方案 »

  1.   


    public void set(User u){
            User u1 = new User();
            u1.setName("32");
            u = u1;
        }
    因为这个u对象只是在这个方法作用域里有效,并不是main函数里面的u,是两个不同的对象
      

  2.   


    但是如果:public void set(User u){
            u.setName("32");
        }
    还是会打印有值的。是什么原因导致不是一个对象的?
      

  3.   

    就像你说的,是把外面的User对象引用传给set 方法的User对象了。二者指向一个地址,但二者还是二个不同对象。
    所以在set方法中,u = u1 只影响方法内的对象,main方法中的还是指向原来的地址。所以其name值还是空。至于如果执行u.setName("32");因为set方法内外二个对象是指向同一个地址,所以就等于main方法中那个对象的name值改变了,所以输出32。没什么不好理解的。
      

  4.   

    楼主对java的参数传递不是太理解,对于对象,Java传递的是一个引用。看下面在代码上的注释吧。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    }
    }
    可见,地址为00000003的对象的name是改变了,但是在函数执行完毕就没用了,而在主函数中,u这个变量的地址是没有地方改动过的,如果你还不理解,可以把代码改成下面的做一下尝试,希望有助于你明白:public class test
    {
        private static String s;
        
        public User set(User u){//增加返回值
            User u1 = new User();
            u1.setName("32");
            u = u1;
        }
        public static void main(String[] args)
        {
            User u =new User();
            test t = new test();
            u=t.set(u);//将变量u的值改变
            System.out.println(u.getName());//输出32
        }
    }
      

  5.   

    set函数中少写了返回语句:return u;public class test
    {
        private static String s;
        
        public User set(User u){//增加返回值
            User u1 = new User();
            u1.setName("32");
            u = u1;
            return u;
        }
        public static void main(String[] args)
        {
            User u =new User();
            test t = new test();
            u=t.set(u);//将变量u的值改变
            System.out.println(u.getName());//输出32
        }
    }
      

  6.   

    或者将代码改变成public class test
    {
        private static String s;
        
        public void set(User u){
            u.setName("32");//直接对传过来的对象地址所指向空间的值进行改
        }
        public static void main(String[] args)
        {
            User u =new User();
            test t = new test();
            t.set(u);//u的地址没变,但里面值变了
             System.out.println(u.getName());//输出32
        }
    }
      

  7.   


    public class Test

        public void set(User u){//该u的范围为该方法,引用地址同主方法中传过来的u
            User u1 = new User();
            u.setName("32");
            System.out.println(u);
            u = u1;//这里改变不了主方法里面的u的应用,只是改变了该局部范围内的u的引用
            System.out.println(u+"\t"+u1);
        }
        public static void main(String[] args)
        {
            User u =new User();
            Test t = new Test();
            t.set(u);
            System.out.println(u);
            System.out.println(u.getName());
        }
    }你可以执行下这个,注意看各个User实例的应用,你就会明白。或者你把public void set(User u)改为u2
    这样就更清楚了。