Chinaunix

标题: 真搞不懂这两个程序为嘛输出结果不一样 很混乱。。 [打印本页]

作者: GalaxyNext    时间: 2012-05-17 02:54
标题: 真搞不懂这两个程序为嘛输出结果不一样 很混乱。。

作者: sunny7476    时间: 2012-05-17 15:38
字符串(String)类型不能直接被方法修改。记住这点就行了。可以通过return来实现。
如第一个程序这样就该就可以了。
  1.         public static void main(String[] args)
  2.         {
  3.                 // TODO Auto-generated method stub
  4.                 String a = "a";
  5.                 a= fun(a);
  6.                 System.out.println(a);
  7.         }
  8.         public static String fun(String b)
  9.         {
  10.                 b= "b";
  11.                 return b;
  12.         }
复制代码

作者: awool_cu    时间: 2012-05-17 16:05
左边的程序输出的是腾讯的结果,因为str2是局部变量,函数调用后,str2就被释放,不能覆盖str1实体变量

右边的程序输出的是马化腾的结果,因为name是个实体变量,具有全局变量性质,所以新值会覆盖旧值
作者: 方兆国    时间: 2012-05-17 21:01
回复 1# GalaxyNext


    其实任何一本基础一点儿的编程语言的书上都有的,函数的临时变量与返回值
作者: GalaxyNext    时间: 2012-05-17 22:14
回复 3# awool_cu


    嘿嘿  好像懂点点  谢谢你们了  小白 好菜。。。
作者: GalaxyNext    时间: 2012-05-17 22:15
回复 4# 方兆国


    谢谢 我就是有点搞不懂对象的引用传递。
作者: 方兆国    时间: 2012-05-17 22:17
回复 7# GalaxyNext


    其实我看到第二个的时候第一反应就是和第一个一样
作者: GalaxyNext    时间: 2012-05-18 23:59
回复 8# 方兆国


    不一样。。
作者: 方兆国    时间: 2012-05-19 16:16
回复 9# GalaxyNext


    然后想了想,发现真的不一样
作者: GalaxyNext    时间: 2012-05-19 23:23
回复 10# 方兆国

........................
   
作者: 大邪神    时间: 2012-06-09 16:13
先说第一个,虽然传过去的也是引用,但是在java中,String 类型是不能改变的,所以,修改 String 值的方法是:新建一个String ,然后指向它,所以,在第一个当中,并没有改变str1所指向的String对象的值。所以,不变。

第二个传过去的是对象的引用,所以在第二个改变String时,已经改变了P1中name的指向,虽然函数返回,但变化已经确定了。所以,这个变了。
作者: pxbfeiniao    时间: 2012-06-10 15:18
引用就是功能受限制的指针!

c/c++/java中,只存在值传递。引用传递也只是传递了引用的值(即地址),并没有传递引用本身。
作者: txoscarr    时间: 2012-06-20 15:08

作者: txoscarr    时间: 2012-06-20 15:15
因为String 是final的,亲
作者: tessykandy    时间: 2012-06-20 16:50
这个涉及到JAVA的深拷贝和浅拷贝的问题

String: 预定义非集合类型, 作为参数时其实是深拷贝

Person: 自定义类型, 作为参数时其实是浅拷贝,拷贝的是引用




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2