如下代码为什么不能赋值成功啊,迷惑
class Foo {
String value;
}
public class Test {
private static void copyFoo(Foo f) {
Foo f1 = new Foo();
f1.value = "xxx";
System.out.println(f1.value);
f = f1;
}
public static void main(String[] args) {
Foo f = new Foo();
copyFoo(f);
System.out.println(f.value);
}
}

解决方案 »

  1.   

    很明显你main方法调用输出f是Foo构造方法中的,而构造方法中没有赋值,所以null。给构造方法赋值
      

  2.   

    class Foo {
        String value;
    }
    public class Test {
        private static Foo copyFoo(Foo f) {
            Foo f1 = new Foo();
            f1.value = "xxx";
            System.out.println(f1.value);
            f = f1;
            return f;
        }
        public static void main(String[] args) {
            Foo f = new Foo();
            f=copyFoo(f);
            System.out.println(f.value);
        }
    }
    改成这样就可以了。
      

  3.   

    我明白了,java里面的参数传递,更类似C++里面的指针,而不是引用
      

  4.   

    f为形参,copyFoo只是改了形参的指向,原内容没变。
      

  5.   

    兄弟明显是从C转java啊。不过两者有一个区别就是C传值有两种:值传递和址传递。但在java里面只有址传递一种,这种设计可能是为了更好的让java面向对象。
      

  6.   

    你在方法内部的语句(f=f1),只是把f1的地址赋值给了f,但没有改变实参f地址对应的值。所以,没有赋值成功。具体看图吧
      

  7.   

    你在方法内部的语句(f=f1),只是把f1的地址赋值给了形参f,但没有改变实参f地址对应的值。所以,没有赋值成功。具体看图吧。
      

  8.   

    为什么这样就可以了,望解释为什么这样就可以了,望解释它把f1的地址返回给了main函数的f,所以f就指向了“xxx”。
      

  9.   

    class Foo {
        String value;
    }
    public class Test {
        private static void copyFoo(Foo f) {
            Foo f1 = new Foo();
            f1.value = "xxx";
            System.out.println(f1.value);
            System.out.println("copyFoo类内f1的地址:"+f1);
            System.out.println("传入copyFoo方法后的f地址:"+f);
            f = f1;
            System.out.println("执行了f=f1后的f地址:"+f);
        }
        public static void main(String[] args) {
            Foo f = new Foo();
            System.out.println("f初始化时的地址:"+f);
            copyFoo(f);
            System.out.println("执行完copyFoo(f)后的地址:"+f);
            System.out.println(f.value);
        }
    }
    输出类似:
    f初始化时的地址:Foo@2687816d
    xxx
    copyFoo类内f1的地址:Foo@a422ede
    传入copyFoo方法后的f地址:Foo@2687816d
    执行了f=f1后的f地址:Foo@a422ede
    执行完copyFoo(f)后的地址:Foo@2687816d
    null
    可以看到copyFoo(Foo f)这样,仅仅是把f的形参指向改了,但f.value并没有变化。
    你可以再试试这样:
    class Foo {
        String value;
    }
    public class Test {
        private static void copyFoo(Foo f) {
            Foo f1 = new Foo();
            f1.value = "xxx";
            System.out.println(f1.value);
            System.out.println("copyFoo类内f1的地址:"+f1);
            System.out.println("传入copyFoo方法后的f地址:"+f);
            f.value = f1.value;
            System.out.println("执行了f=f1后的f地址:"+f);
        }
        public static void main(String[] args) {
            Foo f = new Foo();
            System.out.println("f初始化时的地址:"+f);
            copyFoo(f);
            System.out.println("执行完copyFoo(f)后的地址:"+f);
            System.out.println(f.value);
        }
    }
    把f=f1换成 f.value = f1.value;结果就变成这样了:
    f初始化时的地址:Foo@2687816d
    xxx
    copyFoo类内f1的地址:Foo@a422ede
    传入copyFoo方法后的f地址:Foo@2687816d
    执行了f=f1后的f地址:Foo@2687816d
    执行完copyFoo(f)后的地址:Foo@2687816d
    xxx
    可以看到f的指向一直没有变化,而value值却变化了。
      

  10.   

    f为形参,copyFoo方法只是改了f的指向,而没改变他的内容