日期:2014-05-20  浏览次数:20743 次

一个入门的问题,求指点
如下代码为什么不能赋值成功啊,迷惑


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);
}
}

------解决方案--------------------
很明显你main方法调用输出f是Foo构造方法中的,而构造方法中没有赋值,所以null。给构造方法赋值
------解决方案--------------------
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);
    }
}
改成这样就可以了。
------解决方案--------------------
引用:
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);
    }
}
改成这样就可以了。

授人以鱼
------解决方案--------------------
f为形参,copyFoo只是改了形参的指向,原内容没变。
------解决方案--------------------
兄弟明显是从C转java啊。不过两者有一个区别就是C传值有两种:值传递和址传递。但在java里面只有址传递一种,这种设计可能是为了更好的让java面向对象。
------解决方案--------------------
你在方法内部的语句(f=f1),只是把f1的地址赋值给了f,但没有改变实参f地址对应的值。所以,没有赋值成功。具体看图吧
------解决方案--------------------
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);