如下: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引用被垃圾回收?
跪求解答。
{
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引用被垃圾回收?
跪求解答。
public void set(User u){
User u1 = new User();
u1.setName("32");
u = u1;
}
因为这个u对象只是在这个方法作用域里有效,并不是main函数里面的u,是两个不同的对象
但是如果:public void set(User u){
u.setName("32");
}
还是会打印有值的。是什么原因导致不是一个对象的?
所以在set方法中,u = u1 只影响方法内的对象,main方法中的还是指向原来的地址。所以其name值还是空。至于如果执行u.setName("32");因为set方法内外二个对象是指向同一个地址,所以就等于main方法中那个对象的name值改变了,所以输出32。没什么不好理解的。
{
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
}
}
{
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
}
}
{
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
}
}
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
这样就更清楚了。