class User{
   private String userName;   public String getUserName() {
      return userName;
   }   public void setUserName(String userName) {
      this.userName = userName;
   }
}public class Test{ 
   //更改user中name的方法
   public static void replaceName(User u){ 
      //1
      u.setUserName("bbb");      //2
      User u1 = new User();
      u1.setUserName("bbb");
      u=u1;  
      //3
      User u1=u;
      u1.setUserName("bbb");
   } 
   
   //main函数测试
   public static void main(String args[]){   
      User u= new User();
      u.setUserName("aaa");
      //调用函数更改user中的name
      replaceName(u);
      System.out.println(u.getUserName());
   } 
} //用1)代码输出"bbb"
//用2)代码输出"aaa"
//用3)代码输出"bbb"
//为什么?

解决方案 »

  1.   

    值传递。
    public static void replaceName(User u)
    这个里面的u 其实是一个新的引用,调用的时候只是让u的值等于传递进去的引用的值,其实就是指向的对象的地址。所以在方法里面改变u的引用不会影响原来的引用。
      

  2.   

    google  java pass by value
      

  3.   

    楼上正解。楼主的疑惑应该是2)里,你在2)修改的其实是u的引用,它只影响了你方法里的u,对于main中的u没有影响。
      

  4.   

    传递的是地址,重点解析下2:
    首先u是指向一块地址,我们暂且叫做A,在没有调用方法前,u指向A ,调用方后,把u传进去当参数,相当于吧u的地址复制了一份给c,把c传给方法,在方法中有一个u1赋给了c,那么现在 c指向了u1指向的地址,暂且叫B,现在来看 main方法中的u还是指向运来的A,而传进来的副本c却指向了B,这就是原委
      

  5.   

    搞不懂java的引用传递,一直都很混乱
      

  6.   

    就是说被叫函数体中的参数永远是从外面得到的一份copy,是这样吧
      

  7.   

    晕,java 是值传递。没有引用传递
      

  8.   

    可以去我博客看下啊
    O(∩_∩)O
    http://blog.csdn.net/niuniu20008/archive/2008/09/19/2953785.aspx