实际上,在 Java 中,编译器会将String
转换为常量。
class LongLongString
{
public LongLongString()
{
String newString = "This is a really long long long long long" +
" long long long long long long long long long long long long " +
" long long long long long long long long long string for example.";
}
public static void main(String[] args)
{
new LongLongString();
}
}
被编译成:
Compiled from "LongLongString.java"
class LongLongString extends java.lang.Object{
public LongLongString();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: ldc #2; //String This is a really long long long long long long long long long long long long long long long long long long long long long long long long long long string for example.
6: astore_1
7: return
public static void main(java.lang.String[]);
Code:
0: new #3; //class LongLongString
3: dup
4: invokespecial #4; //Method "<init>":()V
7: pop
8: return
}
可以看出,在第 4 行中加载了单行,而不是String
加载了多个实例。
编辑:源文件是使用javac
版本 1.6.0_06 编译的。查看The Java Language Specification, Third Edition(以及Jon Skeet 的回答中提到的同一部分),我无法找到任何关于编译器是否应该将多行连接String
成单行的参考String
,所以这种行为可能是编译器特定于实现。