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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© IT人 中级黑马   /  2014-1-7 11:29  /  1306 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Test
{
        public static void method_2(StringBuilder sb1,StringBuilder sb2)
        {
                sb1.append(sb2);//这条代码执行以后 sb1的内容是javahello,返回时一个引用,但是楼主并没有定义一个变量接收
                sb1 = sb2;//这里sb1的值变成了hello,没有返回值
                sop(sb1.equals(sb2));//true//这个也没有返回值
        }

        public static void method_1(String s1,String s2)
        {
                s1.replace('a','k');
                s1.replace('a','k');
                s1 = s2;
                sop(s1.equals(s2));//true
        }

        public static void sop(Object obj)
        {
                System.out.println(obj);
        }

        public static void main(String[] args)
        {
                String s1 = "java";
                String s2 = "hello";
                method_1(s1,s2);
                sop(s1+"------"+s2);

                StringBuilder sb1 = new StringBuilder("java");
                StringBuilder sb2 = new StringBuilder("hello");
                method_2(sb1,sb2);//当我们调用的时候应该没有返回值,但是下边的打印结果显示,sb1的内容变成了javahello,请大神解释一下
                sop(sb1+"------"+sb2);
        }
}
打印结果是true
java------hello
true
javahello------hello
我的疑问已经在上边有标注,这个程序是借用的贴吧的一个帖子!先谢谢那个楼主!让我得到一点新发现

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

5 个回复

倒序浏览
这个返回值 是有一定含义的!!
回复 使用道具 举报
看我的注释中的解释

  1. class Test
  2. {
  3.         public static void method_2(StringBuilder sb1,StringBuilder sb2)
  4.         {
  5.                         /*由于形参sb1(下面记为sb1①,以区分实参),sb2(下面记为sb2①)为main函数中实参sb1,sb2的分别的引用,什么是引用呢,
  6.                          * 就是给变量起了一个别名。就是同一个变量
  7.                          *  */
  8.                 sb1.append(sb2);//这条代码执行以后 sb1的内容是javahello,返回时一个引用,但是楼主并没有定义一个变量接收
  9.                 /* 这里没问题,就是将sb2①追加sb1①中 ,也就是将sb2追加sb1中,sb1的值为javahello,sb2为hello*/
  10.                
  11.                 sb1 = sb2;//这里sb1的值变成了hello,没有返回值
  12.                 /* 这里就有问题了,将sb1①这个引用关联到sb2①上,使其指向sb2①这个变量,
  13.                  * 因为sb2①是sb2的引用, 所以sb1①也就是sb2的引用
  14.                  * sb1这个变量就只有这一个名字,sb1①不再是他的别名了,就不是一个变量了。
  15.                  * 现在sb1的值为javahello,(sb1①的值为sb2①的值 也为sb2的值hello)
  16.                  * */
  17.                 sop(sb1.equals(sb2));//true//这个也没有返回值
  18.                 /*sb1①与sb2①现在就是一个变量,所以返回true*/
  19.         }

  20.         public static void method_1(String s1,String s2)
  21.         {
  22.                 s1.replace('a','k');
  23.                 s1.replace('a','k');
  24.                 s1 = s2;
  25.                 sop(s1.equals(s2));//true
  26.         }

  27.         public static void sop(Object obj)
  28.         {
  29.                 System.out.println(obj);
  30.         }

  31.         public static void main(String[] args)
  32.         {
  33.                 String s1 = "java";
  34.                 String s2 = "hello";
  35.                 method_1(s1,s2);
  36.                 sop(s1+"------"+s2);

  37.                 StringBuilder sb1 = new StringBuilder("java");
  38.                 StringBuilder sb2 = new StringBuilder("hello");
  39.                 method_2(sb1,sb2);//当我们调用的时候应该没有返回值,但是下边的打印结果显示,sb1的内容变成了javahello,请大神解释一下
  40.                
  41.                 sop(sb1+"------"+sb2);
  42.                 /*这里调用的就是sb1与sb2了,不是sb1①和sb2①*/
  43.         }
  44. }
复制代码


希望对你的理解有一定帮助

评分

参与人数 1技术分 +2 收起 理由
田磊阳 + 2

查看全部评分

回复 使用道具 举报
StringBuilder 不是基本类型,当调用 method_2(sb1,sb2)时此时传递的是引用,所以当在该方法时修改sb1或sb2的值时被传递的值也将会被修改所以在该方法被调用时sb1的内容变成了javahello


求技术分

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
谢谢!明白了!
回复 使用道具 举报
哦   sb1 = sb2;是sb1指向的地址值变成sb2,
而sb1.原来指向的地址,值不变(append方法会改变),main函数中还持有他的引用,被打印了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马