public class Test{
public static void main(string[] args){
User u1=new User();
User u2=new User();
Test test=new Test();
test.change1(u1);
System.out.println(u1.getName());
test.change1(u2);
System.out.println(u2.getName());
}
void change1(User u){
u.setName("aaa");
}
void change2(User u){
u=new User();
u.setName("aaa");
}
}
输出:aaa
      null
两个输出结果不一样,怎么解释?

解决方案 »

  1.   

    我表示我这样完全没问题
    public class Test {
    public static void main(String[] args) {
    User u1 = new User();
    User u2 = new User();
    Test test = new Test();
    test.change1(u1);
    System.out.println(u1.getName());
    test.change1(u2);
    System.out.println(u2.getName());
    } void change1(User u) {
    u.setName("aaa");
    } void change2(User u) {
    u = new User();
    u.setName("aaa");
    }}class User {
    private String name; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    }
    }
    和你的一样
      

  2.   

    你这代码能跑么
    string[] 改成 String[] //S大写还有结果应该是一样的啊,都是aaa
    class User {
    String name = null; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    }
    }public class Test {
    public static void main(String[] args) {
    User u1 = new User();
    User u2 = new User();
    Test test = new Test();
    test.change1(u1);
    System.out.println(u1.getName());
    test.change1(u2);
    System.out.println(u2.getName());
    } void change1(User u) {
    u.setName("aaa");
    } void change2(User u) {
    u = new User();
    u.setName("aaa");
    }
    }
      

  3.   

    void change2(User u){
    u=new User();
    u.setName("aaa");
    }问题出在这里,u=new User();你又从新New了一遍,从新在内存中分配了空间,下面也相当于从新赋值了。
    你在调用的时候,还用u2.getName(),是不能取到的。
      

  4.   

    额 楼主想考我们这些没安jdk的么
      

  5.   

    void change2(User u){
    u=new User(); //你重新创建了一个对象引用 ,局部变量把传进来的变量给覆盖了
    u.setName("aaa");
    }
      

  6.   

    java 代码那个标签是什么样子的?
      

  7.   


    class User{

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

    public String getName(){
    return this.name ;
    }
    }public class Test2{
    public static void main(String[] args){
    User u1=new User();
    User u2=new User();
    Test2 test=new Test2();
    test.change1(u1);
    System.out.println(u1.getName());
    test.change1(u2);
    System.out.println(u2.getName());
    }
    public void change1(User u){
    u.setName("aaa");
    }
    public void change2(User u){
    System.out.println("参数u :" + u ) ;
    u=new User(); //应该是 u重新指向了新的对象引用,而不是你传递进来的对象
    System.out.println("新建u :" + u ) ;
    u.setName("aaa");//
    }
    }结果:F:\javaTest>java Test2
    aaa
    aaa
      

  8.   

    class User{

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

    public String getName(){
    return this.name ;
    }
    }public class Test2{
    public static void main(String[] args){
    User u1=new User();
    User u2=new User();
    Test2 test=new Test2();
    test.change1(u1);
    System.out.println(u1.getName());
    test.change2(u2);
    System.out.println(u2.getName());
    }
    public void change1(User u){
    u.setName("aaa");
    }
    public void change2(User u){
    System.out.println("参数u :" + u ) ;
    u=new User(); //应该是 u重新指向了新的对象引用,而不是你传递进来的对象
    System.out.println("新建u :" + u ) ;
    u.setName("aaa");//
    }
    }结果:F:\javaTest>java Test2
    aaa
    参数u :User@c3c749
    新建u :User@150bd4d
    null
      

  9.   

    LZ,首先要清楚java中的参数传递都是值传递,对于原生数据类型,直接把值传给形参,对与对象,则是对象引用地址传给形参。
    下面来看你的change2方法:void change2(User u) {
      u = new User();
      u.setName("aaa");
    }传入的是u2这个引用地址,方法u的指向了u2对应的对象,在u = new User();
    之前u的指向的对象都没有发生变法,在new完之后,堆里面生成了一个新的user对象,并且u重新指向了这个新创建的对象,你修改的name值只是修改了新创建的这个对象,而并非修改了u2所指对象的内容。
      

  10.   

    楼主可能写错了,调用了两次test.change1
      

  11.   

    public class Test{
    public static void main(String[] args){
    User u1=new User();
    User u2=new User();
    Test test=new Test();
    test.change1(u1);
    System.out.println(u1.getName());
    test.change2(u2);
    System.out.println(u2.getName());
    }
    void change1(User u){
    u.setName("aaa");
    }
    void change2(User u){
    u=new User();
    u.setName("aaa");
    }
    }
    输出:aaa
       null
    两个输出结果不一样,怎么解释?
    ---------------------------------------
    刚才写错了,第二个是test.change2(u2);
      

  12.   

    我的理解是这样的,
    u2先指向第一个新建的User对象,通过chang2方法,u2指向另一个新建的对象,那就是说u2的指向的对象已经变了,但是u2.getName为空说明u2的引用并没有改变,这个怎么理解
      

  13.   

    不是你那么理解的,u2仍然是指向原来的对象,调用change2方法就相当于是u=u2也就是把u2的地址值赋值给了u,而u2的地址值是没有变化。
      

  14.   

    楼主,import userandtest.User;public class StribgTest1 {
    public static void main(String[] args) {
    User u1 = new User();
    User u2 = new User();
    StribgTest1 test = new StribgTest1();
    test.change1(u1);
    System.out.println(u1.getUname());
    test.change2(u2);
    System.out.println(u2.getUname());
    } void change1(User u) {
    u.setUname("aaa");
    } void change2(User u) {
    u = new User();
    u.setUname("aaa");
    }
    }
    这样执行后的结果是:
    aaa
    null
    但是你调用的两个都是change1的方法,怎么会是这样的结果?
      

  15.   

    自己来解释
    User u1 = new User();产生一个对象和对象引用u1,u1指向这个对象
    void change1(User u) {
     u.setUname("aaa");
     }
    调用chang1方法时又产生一个对象引用u,并把u1指向的地址给u,即u与u1指向的地址相同,当u的name改变是,u1的name也改变,因为他们指向是同一个地址。
    void change2(User u) {
     u = new User();
     u.setUname("aaa");
     }
    调用chang2方法时又产生一个对象引用u,并把u1指向的地址给u,即u与u1指向的地址相同,当执行 u = new User();时产生一个新对象,同时u指向次对象,即u1和u指向的地址不一样,当改变u的值时u1的值并不会改变