黑马程序员技术交流社区

标题: String 类创建对象问题? [打印本页]

作者: 余海龙    时间: 2012-2-8 19:45
标题: String 类创建对象问题?
本帖最后由 余海龙 于 2012-2-9 14:36 编辑

String s = "abc"+"bcd";
这条语句创建了几个对象啊?
大家帮忙详细讲解一下。谢谢!
作者: 成果    时间: 2012-2-8 19:49
三个。一个指象abc  一个指象bcd  。还有一个s指象abcbcd
作者: 杜明辉    时间: 2012-2-8 19:52
创建了一个对象。因为在javac中,对字符串相加进行了优化。
在编译的时候java虚拟机自动进行相加,不在运行中相加。
String s = "abc"+"bcd";  就相当于 String s = "abcbcd";
在用String 时 两个变量时不能相加的,因为变量确定会更改,所以java虚拟机会报错。

作者: 最初的理想    时间: 2012-2-8 20:02
创建了一个对象  请看下面这些实例:
        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。

=============
作者: 易伟    时间: 2012-2-8 21:43
String s = "abc"+"bcd";
我认为创建了1个对象,或者根本就没有创建对象。JVM首先会把abc和bcd进行直接相加成abcdcd,然后JVM回到常量池
中寻找该字符串“abcbcd”,如果找到就直接将s指向那个对象,如果没有找到,则先在常量池中创建一个string对象“abcbcd”,
然后在把s指向这个新创建的对象。
作者: 余海龙    时间: 2012-2-8 21:59
最初的理想 发表于 2012-2-8 20:02
创建了一个对象  请看下面这些实例:
        String s1 = "a";
        String s2 = s1 + "b";

学习了!
作者: 何洪森    时间: 2012-2-8 23:04
创建了一个对象。由于常量的值在编译的时候就已经确定了,"abc","bcd"就相当
于常量,所以String s = "abc"+"bcd";就等同String s = "abcbcd";并把它保存在字符
串池里。
作者: 程洪    时间: 2012-2-8 23:46
{:soso_e110:}肯定 一个了 +在字符串中 是连接符的意思嘛
所以"abc"+"bcd"; 其实就是 "abcbcd"
这句话 就是 定义了一个 String 类的对象 s 并赋值  "abcbcd"。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2