黑马程序员技术交流社区
标题:
传值改变变量的问题
[打印本页]
作者:
冒烟的芒果
时间:
2013-7-24 14:09
标题:
传值改变变量的问题
本帖最后由 杨兴庭 于 2013-7-24 20:53 编辑
class Test3
{
public static void main(String[] args)
{
String[] str1 = new String[]{"123"};
String str2 = "123";
changeStr(str1);
changeStr(str2);
System.out.println(str1[0]);//这里输出“xyz”
System.out.println(str2);//这里输出“123”
}
static void changeStr(String[] str)
{
str[0] = "xyz";
}
static void changeStr(String str)
{
str = "xyz";
}
}
复制代码
为什么可以改变数组变量里面的值,不能改变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