免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: wondershow
打印 上一主题 下一主题

请问这段代码的输出为什么会是这样??谢谢 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2005-05-11 14:03 |只看该作者

请问这段代码的输出为什么会是这样??谢谢

原帖由 "新马甲" 发表:

普通的对象都是传址的对吧,楼上?


普通类的对象都是吧。我没有遇到除了string类以外的传对象copy的。

论坛徽章:
0
22 [报告]
发表于 2005-05-11 16:20 |只看该作者

请问这段代码的输出为什么会是这样??谢谢


  1. public class ArgTest {
  2.         public static void change(MyClass m) {
  3.                 m = new MyClass("new");//没用
  4.         }

  5.         public static void change2(MyClass m) {
  6.                 m.replacableMember = "new2";//这样是可以的
  7.         }

  8.         public static void change3(MyClass m) {
  9.                 m.changeMember("new3");//这样也是可以的
  10.         }

  11.         public static void main(String[] args) {
  12.                 MyClass m = new MyClass("old");
  13.                 System.out.println("The original value: " + m);

  14.                 ArgTest.change(m);
  15.                 System.out.println("change() finished: " + m);

  16.                 ArgTest.change2(m);
  17.                 System.out.println("change2() finished: " + m);

  18.                 ArgTest.change3(m);
  19.                 System.out.println("change3() finished: " + m);
  20.         }
  21. }

  22. class MyClass {
  23.        
  24.         String replacableMember;

  25.         public MyClass(String newMember) {
  26.                 replacableMember = newMember;
  27.         }

  28.         public void changeMember(String newMember) {
  29.                 replacableMember = newMember;
  30.         }

  31.         public String toString() {
  32.                 return "现在的对象内容: " + replacableMember;
  33.         }
  34. }
复制代码

论坛徽章:
0
23 [报告]
发表于 2005-05-11 16:23 |只看该作者

请问这段代码的输出为什么会是这样??谢谢

[1] Java所有的参数都是传值的。也就是传copy的
[2] Java里的对象变量传递的时候实际上传递的是指针,也就是传递的指针的copy,而不是对象的copy
[3] 由[1] 和 [2] 可知对传进来的参数(指针)赋值是没有意义的。
[4] 但是指针指向的对象的内容(数据成员)是可变的

论坛徽章:
0
24 [报告]
发表于 2005-05-11 16:25 |只看该作者

请问这段代码的输出为什么会是这样??谢谢

嗯,
斑竹说的非常得清楚,呵呵。

论坛徽章:
0
25 [报告]
发表于 2005-05-11 20:45 |只看该作者

请问这段代码的输出为什么会是这样??谢谢

谢谢斑竹,我得到一个结论,不知对不对,primitive是传值,非primitive的对象也是传值,只不过传的是reference,属于对象的传值之中又有一个例外,就是String 对象,他传的是String的值,而不是reference.我刚入行,是只小鸟,如果理解不对请指出,谢谢.还有,如果我上面的理解对的话,这个例外是不是也包括对象包装器(Integer,Double,),这些对象在作为参数的时候是不是也是传值而不是传reference??非常感谢花道!!!

论坛徽章:
0
26 [报告]
发表于 2005-05-12 09:31 |只看该作者

请问这段代码的输出为什么会是这样??谢谢

String其实也谈不上例外,在作为参数传递的时候和其他的类没有什么区别。String, Integer,Double等类和我例子里的MyClass类最大的区别就是他们是immutable的。就是没有提供任何方法可以修改对象的内部数据,所以看起来就是传值的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP