如下代码为什么不能赋值成功啊,迷惑
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);
}
}
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);
}
}
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);
}
}
改成这样就可以了。
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值却变化了。