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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiaoxiaofeng 中级黑马   /  2014-8-22 10:27  /  1105 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class StringBuilderTest {
        public static void main(String[] args) {

                StringBuilder s1 = new StringBuilder("hello");
                StringBuilder s2 = new StringBuilder("java");
               
                show(s1,s2);
               
                System.out.println(s1+"......."+s2);
               
        }

        private static void show(StringBuilder s1, StringBuilder s2) {
               
                s1.append(s2);
                s1 = s2;
        }
       
}


运行结果是helloJava..........java
为什么不是Java.........java?

7 个回复

倒序浏览
本帖最后由 不落星辰 于 2014-8-22 12:39 编辑

确实。。没明白。。都差点看错了
回复 使用道具 举报
本帖最后由 依然超级赛亚人 于 2014-8-22 12:47 编辑

回答这道问题之前首先说明,我也不是真的确定我的说法是对的,只是提出自己的一种想方法仅供参考讨论,请楼主斟酌。
我想可能是你的变量定义和使用“分离了”。也就是说你在主方法中定义了s1和s2,但是你却在其他方法show()中使用它们,实际上你只是把在主方法中的两个变量s1和s2的地址值复制了一份去用,你虽然在show()中做了地址的变化,但是你并没有改变主方法下这两个变量的地址。也就是只在show()中你的这两个变量的地址值可以相等,打印出相同结果java----java。而你把打印语句写在主方法中,它当然还是主方法下的状态,这跟定义基本类型变量可能没区别。
比如你在main中定义了这条语句:
int a= 10,b=20;
你用show(int a,int b)封装了int sum;
sum=a+b;
a=b;
这几条语句,然后在main中调用show(a,b)和System.out.println(a+b);你认为会出现结果是40的情况吗?可以试试。

回复 使用道具 举报
在show()方法里s1 = s2 ,s1根本没指向s2的值
把s1.append(s2);注释掉。。打印输出的是:hello.......java
回复 使用道具 举报
你方法里调用的都是形参。都是在操作形参。假如你想输出Java.........java的时候,你必须运算完毕后返回结果。
回复 使用道具 举报
show(a,b);
private static void show(StringBuilder s1, StringBuilder s2) ;
都用s1和s2有点看不清,我把调用的地方换成了a和b

调用的时候相当于做了以下的动作:
s1 = a, s2 = b;
如果在show函数里操作s1跟s2,就相当于:
s1 = s2,跟a和b完全无关

Understand?

回复 使用道具 举报
s1=s2这里,这个操作是把s1(这个s1是原s1指引的复制)指引指向s2的对象,对原s1没影响,这里涉及java参数是值传递的问题。
回复 使用道具 举报
学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马