黑马程序员技术交流社区
标题:
String的值传递问题
[打印本页]
作者:
卢乾荣
时间:
2015-3-28 22:37
标题:
String的值传递问题
public class StringTest4
{
public static void main(String[] args) {
String s="abc";
show(
s
);
System.out.println(s);//
答案为abc,
看这里s为什么为abc, s不是引用型变量吗,引用类型,形式参数会影响到实际参数???
}
public static void show(String s)
{
s+=s;
System.out.println(s);
//
abcabc
既然这里s变成了abcabc,那变量s也应该是abcabc才对
}
}
作者:
fantacyleo
时间:
2015-3-28 23:31
java参数传递就二句话:1. 值传递 2. 搞清楚传的是什么值。
引用类型传的是地址值。自己画个图分析吧。实在不明白多看几遍基础视频
作者:
Dark县令
时间:
2015-3-28 23:47
String 的值是不可变的它调用的必然是s是定义出来的“abc”,而show里面的值只是将s+s的地址值赋值给了前一个s
并没有改变String s 的值!
作者:
liyanghml
时间:
2015-3-29 03:15
public class Test1
{
public static void main(String[] args) {
String s="abc";
String s1 = show(s);
System.out.println(s1);
}
public static String show(String s)
{
s+=s;
return s
}
}
复制代码
我觉得这样 你是不是 更好理解呢,你刚才虽然调用show()方法,但他只是在show()里边进行变化,变化的值没有传出来。所以,肯定还是原值输出。。
作者:
李能甫
时间:
2015-3-29 09:07
标题:
哇!看错了
本帖最后由 李能甫 于 2015-3-29 09:08 编辑
刚犯糊涂了,回错帖子了
作者:
lf027
时间:
2015-3-29 09:13
这题真经典,我都研究了好一会,其实搞清楚了String s1=new String("abc"); 与 String s2="abc"两个的区别在哪就知道这题是怎么回事了
String s1=new String("abc");它在内存中有两个对象存在,一个在堆中,一个在常量池中
tring s2="abc";它在内存中只有一个对象存在,在常量池中
作者:
chenlanaq
时间:
2015-3-29 10:10
本帖最后由 chenlanaq 于 2015-3-29 10:16 编辑
s+=s是相当于s=s+s的,你把一个新的字符串的地址赋值给了局部变量s,并不是改变了s地址内的字符串的值,想要改变值,用stringbuffer吧,然后在show里,用append
@Test
public void test(){
StringBuffer sb=new StringBuffer("abc");
show(sb);
System.out.println(sb);
}
private void show(StringBuffer sb) {
sb.append(sb);
System.out.println(sb);
}
复制代码
作者:
卢乾荣
时间:
2015-3-29 17:10
兄弟们,谢谢,你们的回答。还是没解答我的疑问,s是个引用型变量,它做的地址值的传递,我明白这个,我的疑问是s+s它们都指向的是常量池中的“abc”,他俩相加不就成了一个新的地址值吗,在付给了变量s,(
只想转黑马币,而瞎回帖的,请绕行,谢谢
)
作者:
111111111111
时间:
2016-6-4 21:44
s+s也是字符串在加,但是他加了以后地址值是改变了的新的地址值,对以前那个不影响的,String一旦创建无法修改,改了只是把原来的变为垃圾,重新创建了一个
作者:
dogdogdog
时间:
2016-6-4 22:06
下一个方法的s指向的不再是“abc”了,我觉得可以理解为show方法里的s+=s是两个变量的,打印出来的s是另一个
作者:
星际传奇
时间:
2016-6-4 23:43
String是个两面派
基本数据类型
引用数据类型
都能搞上关系
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2