日期:2014-05-20 浏览次数:20633 次
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"); [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()); } }
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传递的是一个引用。看下面在代码上的注释吧。
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 } }