黑马程序员技术交流社区

标题: 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
  1. public class Test1
  2. {
  3.        public static void main(String[] args) {
  4.                 String s="abc";
  5.                 String s1 = show(s);
  6.                 System.out.println(s1);
  7.         }
  8.        public static String show(String s)
  9.        {
  10.                s+=s;
  11.                return s
  12.        }
  13. }
复制代码
我觉得这样 你是不是 更好理解呢,你刚才虽然调用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
  1. @Test
  2.         public void test(){
  3.                 StringBuffer sb=new StringBuffer("abc");
  4.                 show(sb);
  5.                 System.out.println(sb);
  6.         }

  7.         private void show(StringBuffer sb) {
  8.                 sb.append(sb);
  9.                 System.out.println(sb);
  10.         }
复制代码




作者: 卢乾荣    时间: 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