黑马程序员技术交流社区

标题: 关于String的问题 [打印本页]

作者: 逸盏清茶    时间: 2013-5-13 02:56
标题: 关于String的问题
本帖最后由 逸盏清茶 于 2013-5-13 12:38 编辑
  1. class Demo
  2. {

  3.     public static void changeStr(String str)
  4.         {
  5.         str="welcome";
  6.     }
  7.     public static void main(String[] args)
  8.         {

  9.         String str="hello,weorld";
  10.         changeStr(str);
  11.         System.out.println(str);
  12.     }
  13. }
复制代码
为什么打印的是hello,weorld,而不是 welcome,str不是已经指向了welcome 了吗 ?


作者: 钟林杰    时间: 2013-5-13 03:30
你打印的是主函数里面的str,你改变的只是changeStr参数里的str。你在调用changeStr的时候在里面改变不了主函数的str,因为string传的是值而不是地址。据我所知只有数组才会传地址,也就是说只有传数组时才能改变主函数中的值。
作者: 李征    时间: 2013-5-13 07:08
你好,这是实参形参值传递的问题,函数调用中发生的数据传送是单向的。,就是只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。
想打印WELCOME的话,建议主函数里改为System.out.println(changeStr(str));
作者: rosv    时间: 2013-5-13 07:45
通俗的说,在Java中只有一种,值传递,只有对象才能传递引用
作者: 飞鸟青崖    时间: 2013-5-13 07:46
输出语句在主函数中,里面的str指的是主函数中的str。
在运行的时候,会在栈内存中开辟一个空间,用于存储调用到的函数中的变量,
所以当你调用changeStr的时候,会开辟一个空间存储它的局部变量str,注意:这个空间和主函数的空间是两个不同的空间。
而chanegeStr只是改变了本身的str,并没有改变主函数中的str,所以输出的还是主函数中str对应的值。
如果你想要改变主函数中str的值,可以用下面的代码
  1. class E2
  2. {
  3.         public static String changeStr(String str)
  4.         {
  5.                 str="welcome";
  6.                 return str;//返回值。
  7.        }
  8.         public static void main(String[] args)
  9.         {
  10.                 String str="hello,weorld";
  11.                 str = changeStr(str);//用str接收changeStr的返回值,这样就改变了str的值。
  12.                System.out.println(str);
  13.         }
  14.         
  15. }
复制代码

作者: 徐启坤    时间: 2013-5-13 08:25
  1. class E2
  2.     {
  3.             public static String changeStr(String str)
  4.             {
  5.                     str="welcome";
  6.                     System.out.println("2:"+str);    //输出 welcome
  7.                     return str;   
  8.            }
  9.             public static void main(String[] args)
  10.             {
  11.                     String str="hello,weorld";
  12.                     System.out.println("1:"+str);    //输出hello,weorld
  13.                    System.out.println("3:"+changeStr(str));   //输出 welcome
  14.             }
  15.             
  16.     }
复制代码
同学,变量是有作用域的,你在函数中改变了str,只在本函数中有效,所以在函数里的输出是welcome;
在主函数中的第一个输出是hello world
第二个输出是函数返回的字符串,同为welcome
作者: 刘胜寒    时间: 2013-5-13 08:32
钟林杰 发表于 2013-5-13 03:30
你打印的是主函数里面的str,你改变的只是changeStr参数里的str。你在调用changeStr的时候在里面改变不了主 ...

基本类型和String都是值传递。其他数组和引用类型都是传递地址。
作者: 刘胜寒    时间: 2013-5-13 08:37
楼主注意结贴。。。
作者: 钟林杰    时间: 2013-5-13 09:23
刘胜寒 发表于 2013-5-13 08:32
基本类型和String都是值传递。其他数组和引用类型都是传递地址。

嗯,学习了!
作者: 逸盏清茶    时间: 2013-5-13 12:24
谢谢 ,明白了 。
作者: 段旭东    时间: 2013-5-13 12:29
逸盏清茶 发表于 2013-5-13 12:24
谢谢 ,明白了 。

点击 一楼下面的编辑 帖子分类 改成 已解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2