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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冒烟的芒果 中级黑马   /  2013-7-24 14:09  /  1578 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-24 20:53 编辑
  1. class  Test3
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String[] str1 = new String[]{"123"};
  6.                 String str2 = "123";
  7.                 changeStr(str1);
  8.                 changeStr(str2);
  9.                 System.out.println(str1[0]);//这里输出“xyz”
  10.                 System.out.println(str2);//这里输出“123”
  11.         }
  12.         static void changeStr(String[] str)
  13.         {
  14.                 str[0] = "xyz";
  15.         }
  16.         static void changeStr(String str)
  17.         {
  18.                 str = "xyz";
  19.         }
  20. }
复制代码
为什么可以改变数组变量里面的值,不能改变String变量的值呢?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

6 个回复

倒序浏览
如果实际参数传递的是引用类型,那么形式参数也指向了实际参数在内存中的地址。操作形式参数就相当于在操作实际参数。
而 如果实际参数传递的是基本数据类型,那么操作形式参数,实际参数在内存中的值不会改变。

对于String类型的传参问题:
一方面字符串直接赋值时,String类型的变量所引用的值是存储在类的常量池中的。(String str="abc";)
另一方面String是个不可变类型,所以这个String类型的变量相当于是对一个常量的引用。这种情况下,变量的内存空间大小是在编译期就已经确定的。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
class  Test3
{
        public static void main(String[] args)
        {
                String[] str1 = new String[]{"123"};
                String str2 = "123";
                changeStr(str1);  //这里传的是数组名 引用变量
                changeStr(str2);        //这里传的是str2这个变量里面存的值 即:123
                System.out.println(str1[0]);//这里输出“xyz”
                System.out.println(str2);//这里输出“123”
        }
        static void changeStr(String[] str)
        {
                        //这里的形式参数str接收的是str1的地址  
                str[0] = "xyz";//这里改变str就是改变str1
        }
        static void changeStr(String str)
        {
                        //这里形式参数str接收的是str2的值
                str = "xyz";//这里改变的只是形式参数的值
        }
}

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
String [] str1=new String[]{"123"}; 在内存中开辟了一块新的空间 str[0]="xyz"时str1=str[0];
String str2="123"; 字符串赋值后是不能被改变的;

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
如果字符串需要经常改变,一般选择用StringBuffer
回复 使用道具 举报
(1)第一个输出语句输出的"xyz",是因为字符串数组的首地址引用被改成了指向“xyz”,因此输出str1【0】时,就是输出xyz
(2)第二个输出语句输出的是"123",是因为,string一旦建立对象。是final的,是不可更改的。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
简单的说,数组传过去的是地址,String变量里传过去的是实参,地址传过去,改变了,原来的也就改变了,但是参数传过去,又没有返回值,函数调用完,就消失了,所以没改掉。你可以做个返回值 让它返回回来,就行了。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马