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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张艳艳 中级黑马   /  2013-1-5 16:29  /  1537 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张艳艳 于 2013-1-9 14:45 编辑

public class TestStirng
{
        public static void test(String str)
        {
            str = "red";
   
        }
        public static void main(String[] args)
        {
            String  color = new String("green");
            test(color);
            
  System.out.println(color); //为什么打印的是green而不是red???
}
}
求详解

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 鼓励分!

查看全部评分

3 个回复

倒序浏览
String  color = new String("green");
//这里其实创建两个对象,一个是开了空间在栈里面存的是"green",一个是color
test(color);
//这时候你调用了方法,改变的是color的值变为red 栈里面有值。
但是由于String为引用对象,在主函数并没有被传回来,你没有用变量去接
System.out.println(color); //此时打印的还是第一次栈里面值 green

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
LZ 这里其实涉及到了函数的调用过程,并不是因为你么有return。
1、当你调用test(String str)方法的时候  虚拟机首先会进入test方法运行,test方法有一个String变量,这个Stirng对象只对test方法有效。
2、然后我们的主函数会将color实参传入给test方法,为String对象分配内存并传值,然后进行运算。

就上面的函数调用过程可以看出  就算你在test函数里面 返回了return str  那么打印出来的依然是green

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 何竹冬 于 2013-1-6 14:18 编辑

你好
当你在调用test方法时,实际在栈内存中创建了一个临时的字符串引用来接受你传入的引用。
当你将栈中的引用指向red字符串的时候改变了这个引用但是原来的引用值没有改变。
你可以在test方法中返回str然后在主函数中接受就可以改变原引用的值。
  1. public class Test
  2. {
  3.         public static String test(String str)
  4.         {
  5.                 str="red";
  6.                 return str;
  7.         }
  8.         public static void main(String[] args) throws Exception
  9.         {
  10.                 String str="green";
  11.                 str=test(str);
  12.                 System.out.println(str);
  13.         
  14.         }
  15. }
复制代码
打印结果是red.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马