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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卢乾荣 中级黑马   /  2015-3-28 22:37  /  1010 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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才对
       }
}

评分

参与人数 1技术分 +2 收起 理由
lwj123 + 2 问的好!

查看全部评分

10 个回复

倒序浏览
java参数传递就二句话:1. 值传递 2. 搞清楚传的是什么值。
引用类型传的是地址值。自己画个图分析吧。实在不明白多看几遍基础视频
回复 使用道具 举报
String 的值是不可变的它调用的必然是s是定义出来的“abc”,而show里面的值只是将s+s的地址值赋值给了前一个s
并没有改变String s 的值!
回复 使用道具 举报
  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:08 编辑

刚犯糊涂了,回错帖子了
回复 使用道具 举报
这题真经典,我都研究了好一会,其实搞清楚了String s1=new String("abc");  与 String s2="abc"两个的区别在哪就知道这题是怎么回事了
String s1=new String("abc");它在内存中有两个对象存在,一个在堆中,一个在常量池中
tring s2="abc";它在内存中只有一个对象存在,在常量池中
回复 使用道具 举报
本帖最后由 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.         }
复制代码



回复 使用道具 举报
兄弟们,谢谢,你们的回答。还是没解答我的疑问,s是个引用型变量,它做的地址值的传递,我明白这个,我的疑问是s+s它们都指向的是常量池中的“abc”,他俩相加不就成了一个新的地址值吗,在付给了变量s,(只想转黑马币,而瞎回帖的,请绕行,谢谢)
回复 使用道具 举报
s+s也是字符串在加,但是他加了以后地址值是改变了的新的地址值,对以前那个不影响的,String一旦创建无法修改,改了只是把原来的变为垃圾,重新创建了一个
回复 使用道具 举报
下一个方法的s指向的不再是“abc”了,我觉得可以理解为show方法里的s+=s是两个变量的,打印出来的s是另一个
回复 使用道具 举报
String是个两面派
基本数据类型
引用数据类型
都能搞上关系
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马