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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余海龙 黑马帝   /  2012-2-8 19:45  /  2467 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余海龙 于 2012-2-9 14:36 编辑

String s = "abc"+"bcd";
这条语句创建了几个对象啊?
大家帮忙详细讲解一下。谢谢!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

7 个回复

倒序浏览
三个。一个指象abc  一个指象bcd  。还有一个s指象abcbcd
回复 使用道具 举报
创建了一个对象。因为在javac中,对字符串相加进行了优化。
在编译的时候java虚拟机自动进行相加,不在运行中相加。
String s = "abc"+"bcd";  就相当于 String s = "abcbcd";
在用String 时 两个变量时不能相加的,因为变量确定会更改,所以java虚拟机会报错。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
创建了一个对象  请看下面这些实例:
        String s1 = "a";
        String s2 = s1 + "b";
        String s3 = "a" + "b";
        System.out.println(s2 == "ab");
        System.out.println(s3 == "ab");
        第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
        题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
                        String s = "a" + "b" + "c" + "d";
                        System.out.println(s == "abcd");
        最终打印的结果应该为true。

=============

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
String s = "abc"+"bcd";
我认为创建了1个对象,或者根本就没有创建对象。JVM首先会把abc和bcd进行直接相加成abcdcd,然后JVM回到常量池
中寻找该字符串“abcbcd”,如果找到就直接将s指向那个对象,如果没有找到,则先在常量池中创建一个string对象“abcbcd”,
然后在把s指向这个新创建的对象。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
最初的理想 发表于 2012-2-8 20:02
创建了一个对象  请看下面这些实例:
        String s1 = "a";
        String s2 = s1 + "b";

学习了!
回复 使用道具 举报
创建了一个对象。由于常量的值在编译的时候就已经确定了,"abc","bcd"就相当
于常量,所以String s = "abc"+"bcd";就等同String s = "abcbcd";并把它保存在字符
串池里。
回复 使用道具 举报
{:soso_e110:}肯定 一个了 +在字符串中 是连接符的意思嘛
所以"abc"+"bcd"; 其实就是 "abcbcd"
这句话 就是 定义了一个 String 类的对象 s 并赋值  "abcbcd"。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马