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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class  StringTest
{
        public static void main(String[] args) {
                String s1 = "java";
                String s2 = "hello";
               
                method_1(s1,s2);
               
                System.out.println(s1+"...."+s2); //java....hello

                System.out.println("--------------------------");
               
                StringBuilder s11 = new StringBuilder("java");
                StringBuilder s22 = new StringBuilder("hello");
                method_2(s11,s22);

               
                System.out.println(s11+"-----"+s22); //javahello-----hello
        }
        public static void method_1(String s1,String s2){
                s1.replace('a','k');
                s1 = s2;
       
        }
        public static void method_2(StringBuilder s1,StringBuilder s2){
                s1.append(s2);       
                s1 = s2;
               
        }
}


评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

7 个回复

倒序浏览
各位同学,有懂得请帮忙解答一下!
:dizzy:
回复 使用道具 举报
yinxjfly 发表于 2014-5-30 19:52
各位同学,有懂得请帮忙解答一下!

解答什么
回复 使用道具 举报
分析思路和运算结果!
回复 使用道具 举报

分析思路和运算结果!
标题不有写麽!
回复 使用道具 举报
你是想问为什么结果和函数定义的想要的结果不一样吗?

首先,java中函数传递参数的方式是按值传递的,参数是对象时,传递给函数的仅仅是变量的一个副本,它指向相同的地址。所以method_1()和method_2()中s1 = s2;这句话不起作用,main函数中s1,s11的变量的值仍然没改变。跟c中的指针有点像。

但是method_2()中s1.append(s2);有起作用,因为它把对象的值改变了,所以s11输出结果是javahello。

至于method_1()中s1.replace('a','k');这句话,replace方法有返回值,返回一个新的String对象,你没接收,所以s1没改变。

要想得到预期的结果,可以把变量设置为全局变量。
回复 使用道具 举报
本帖最后由 黎志勇 于 2014-5-30 21:41 编辑

首先要明确 引用类型的变量的变量值实际是一个地址,存放在栈内存中;而该引用类型变量对应的对象实体,存放在堆内存中,这个在堆内存中的地址,就是引用类型的变量存储的地址值。
String s1 = "java";
上面的语句,就是堆内存中有一个字符串对象"java",s1获得了该"java"字符串的一个引用,存储了字符串"java"对象的地址。

下面分析程序,
执行 method_1(s1,s2) 时,main()中的s1、s2把字符串对象"java"、"hello"的地址传递给method_1()中的s1、s2,使其获得字符串对象"java"、"hello"的引用,但是要注意的是,main()中的s1和s2依然引用"java"、"hello"。
运行 s1.replace('a','k'); 时,先会在堆内存中创建一个新的对象"jkvk",而method_1()中的s1先断开对"java"的引用,然后再引用"jkvk","java"所在的堆内存中的内容,根本就没有改变,
之后就很好解释了,
运行 s1 = s2; 后,又method_1()中的s2对"hello"的引用又传递给method_1()中的s1,
这时,各个变量的引用是:
----------------------
main()中的s1 = "java"
main()中的s2 = "hello"
method_1()中的s1 = "hello"
method_1()中的s2 = "hello"
----------------------
至于下面对StringBuilder的对象的操作,StringBuilder和String的不同是,String对象一旦初始化后,该对象在堆内存中的的值就不能修改,
比如String str = "aaa"; str = "bbb";不是把"aaa"所在堆内存的内容给改成"bbb",而是在堆内存的其他地方创建"bbb"对象,然后把str的对"aaa"的引用释放掉,再去引用"bbb",
而StringBuilder中的方法则可以对已经在堆内存中初始化的对象的内容进行修改,而不用另外创建对象和重新引用。
所以在执行 s1.append(s2); 这句时,会对StringBuilder对象"java"所在的那片堆内存进行修改,拼接上StringBuilder对象"hello"的内容,而得到的StringBuilder对象"javahello",这个对象的地址跟StringBuilder对象"java"的地址一样。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黎志勇 发表于 2014-5-30 21:16
首先要明确 引用类型的变量的变量值实际是一个地址,存放在栈内存中;而该引用类型变量对应的对象实体,存 ...

分析的很清楚!明白了!多谢啦!:D
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马