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);
}
}
改成这样就可以了。 ------解决方案--------------------
授人以鱼 ------解决方案-------------------- 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);