A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逸盏清茶 中级黑马   /  2013-5-13 02:56  /  1694 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 逸盏清茶 于 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 08:33

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

10 个回复

倒序浏览
输出语句在主函数中,里面的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. }
复制代码

评分

参与人数 1黑马币 +10 收起 理由
逸盏清茶 + 10

查看全部评分

回复 使用道具 举报
钟林杰 发表于 2013-5-13 03:30
你打印的是主函数里面的str,你改变的只是changeStr参数里的str。你在调用changeStr的时候在里面改变不了主 ...

基本类型和String都是值传递。其他数组和引用类型都是传递地址。
回复 使用道具 举报
钟林杰 来自手机 中级黑马 2013-5-13 03:30:56
沙发
你打印的是主函数里面的str,你改变的只是changeStr参数里的str。你在调用changeStr的时候在里面改变不了主函数的str,因为string传的是值而不是地址。据我所知只有数组才会传地址,也就是说只有传数组时才能改变主函数中的值。来自: Android客户端
回复 使用道具 举报
你好,这是实参形参值传递的问题,函数调用中发生的数据传送是单向的。,就是只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。
想打印WELCOME的话,建议主函数里改为System.out.println(changeStr(str));

点评

你因该说把changstr函数返回一个值。。。不然就是错的。。新人鼓励一下。。  发表于 2013-5-13 08:36

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
通俗的说,在Java中只有一种,值传递,只有对象才能传递引用

点评

java只有值传递,只不过是引用类型传递的是地址值  发表于 2013-5-13 08:37

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
  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
基本类型和String都是值传递。其他数组和引用类型都是传递地址。

嗯,学习了!
回复 使用道具 举报
谢谢 ,明白了 。
回复 使用道具 举报
逸盏清茶 发表于 2013-5-13 12:24
谢谢 ,明白了 。

点击 一楼下面的编辑 帖子分类 改成 已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马