黑马程序员技术交流社区

标题: 传值改变变量的问题 [打印本页]

作者: 冒烟的芒果    时间: 2013-7-24 14:09
标题: 传值改变变量的问题
本帖最后由 杨兴庭 于 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变量的值呢?
作者: 月亮人生    时间: 2013-7-24 14:43
如果实际参数传递的是引用类型,那么形式参数也指向了实际参数在内存中的地址。操作形式参数就相当于在操作实际参数。
而 如果实际参数传递的是基本数据类型,那么操作形式参数,实际参数在内存中的值不会改变。

对于String类型的传参问题:
一方面字符串直接赋值时,String类型的变量所引用的值是存储在类的常量池中的。(String str="abc";)
另一方面String是个不可变类型,所以这个String类型的变量相当于是对一个常量的引用。这种情况下,变量的内存空间大小是在编译期就已经确定的。
作者: 曹奎    时间: 2013-7-24 14:48
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";//这里改变的只是形式参数的值
        }
}
作者: yinjiek    时间: 2013-7-24 15:29
String [] str1=new String[]{"123"}; 在内存中开辟了一块新的空间 str[0]="xyz"时str1=str[0];
String str2="123"; 字符串赋值后是不能被改变的;
作者: xscn    时间: 2013-7-24 16:27
如果字符串需要经常改变,一般选择用StringBuffer
作者: 熊纪达    时间: 2013-7-24 16:33
(1)第一个输出语句输出的"xyz",是因为字符串数组的首地址引用被改成了指向“xyz”,因此输出str1【0】时,就是输出xyz
(2)第二个输出语句输出的是"123",是因为,string一旦建立对象。是final的,是不可更改的。
作者: litaojisuanji    时间: 2013-7-24 17:48
简单的说,数组传过去的是地址,String变量里传过去的是实参,地址传过去,改变了,原来的也就改变了,但是参数传过去,又没有返回值,函数调用完,就消失了,所以没改掉。你可以做个返回值 让它返回回来,就行了。




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