一个入门的问题,求指点

gemo 2013-11-04 09:31:29
如下代码为什么不能赋值成功啊,迷惑


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);
}
}
...全文
387 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolong806124 2013-11-04
  • 打赏
  • 举报
回复
引用 9 楼 yinan9 的回复:
[quote=引用 2 楼 zhiqiu 的回复:] 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); } } 改成这样就可以了。
为什么这样就可以了,望解释[/quote]
引用 9 楼 yinan9 的回复:
[quote=引用 2 楼 zhiqiu 的回复:] 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); } } 改成这样就可以了。
为什么这样就可以了,望解释[/quote]它把f1的地址返回给了main函数的f,所以f就指向了“xxx”。
yinan9 2013-11-04
  • 打赏
  • 举报
回复
引用 2 楼 zhiqiu 的回复:
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); } } 改成这样就可以了。
为什么这样就可以了,望解释
xiaolong806124 2013-11-04
  • 打赏
  • 举报
回复
你在方法内部的语句(f=f1),只是把f1的地址赋值给了形参f,但没有改变实参f地址对应的值。所以,没有赋值成功。具体看图吧。
xiaolong806124 2013-11-04
  • 打赏
  • 举报
回复
你在方法内部的语句(f=f1),只是把f1的地址赋值给了f,但没有改变实参f地址对应的值。所以,没有赋值成功。具体看图吧
猿来这样 2013-11-04
  • 打赏
  • 举报
回复
兄弟明显是从C转java啊。不过两者有一个区别就是C传值有两种:值传递和址传递。但在java里面只有址传递一种,这种设计可能是为了更好的让java面向对象。
z2007130205 2013-11-04
  • 打赏
  • 举报
回复
f为形参,copyFoo只是改了形参的指向,原内容没变。
gemo 2013-11-04
  • 打赏
  • 举报
回复
我明白了,java里面的参数传递,更类似C++里面的指针,而不是引用
whos2002110 2013-11-04
  • 打赏
  • 举报
回复
引用 2 楼 zhiqiu 的回复:
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); } } 改成这样就可以了。
samson_ 2013-11-04
  • 打赏
  • 举报
回复
很明显你main方法调用输出f是Foo构造方法中的,而构造方法中没有赋值,所以null。给构造方法赋值
基础学起 2013-11-04
  • 打赏
  • 举报
回复
f为形参,copyFoo方法只是改了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); 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值却变化了。
student-ai 2013-11-04
  • 打赏
  • 举报
回复
引用 3 楼 whos2002110 的回复:
[quote=引用 2 楼 zhiqiu 的回复:] 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); } } 改成这样就可以了。
授人以鱼[/quote] 不如授人以渔。 传值的问题。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧