Java-奇怪的静态字符串行为-新字符串(";xxx";)与";xxx“;
理论上如果到处都是静力学,它会导致“恩,恩,恩” 结果:“en,null,en” 预期为:“en,null,null”(因为我发现静态顺序实际上很重要) 有人能解释一下吗?Java-奇怪的静态字符串行为-新字符串(";xxx";)与";xxx“;,java,string,static,initialization,Java,String,Static,Initialization,理论上如果到处都是静力学,它会导致“恩,恩,恩” 结果:“en,null,en” 预期为:“en,null,null”(因为我发现静态顺序实际上很重要) 有人能解释一下吗? “en”和新字符串(“en”)有什么不同。在调用该方法时,str2尚未初始化(字段按声明顺序初始化),str3是编译时常量 编译时常量由编译器在类文件中内联。新字符串(“..”)不是常量,因为它使用构造函数 字符串常量由字符串文本“”定义,它们被放置在jvm实例的字符串池中,以便重用。与此相反,使用新字符串(..)会创建一个
“en”和新字符串(“en”)有什么不同。在调用该方法时,str2尚未初始化(字段按声明顺序初始化),str3是编译时常量 编译时常量由编译器在类文件中内联。新字符串(“..”)不是常量,因为它使用构造函数
字符串常量由字符串文本“”定义,它们被放置在jvm实例的字符串池中,以便重用。与此相反,使用新字符串(..)会创建一个新实例,因此应该避免使用。发生这种情况是因为使用常量初始化的类变量首先被初始化,然后才是更复杂的初始值设定项(就像使用
new String()
的表达式)完成(然后按源代码顺序完成)。见:
8.3.2.1。类变量的初始值设定项
[……]
在运行时,首先初始化静态
字段,这些字段是最终
,并用常量表达式()初始化()。这也适用于接口()中的此类字段。这些字段是“常量”,即使是通过不正当的程序()也不会观察到它们的默认初始值()
1.其原因是
str3=“en”是文本池中的字符串文本,而str1=new String(“en”)是字符串对象池中的字符串对象
2.由于“en”是一个文本,即“常量”,它将在开头初始化
3.它也被称为常数折叠,预先计算常数以更快地执行。是否应将内联
更改为内联
?+1,因为我不知道您可以这样初始化内联。。。
public class Test {
private static final String str1 = new String("en");
private static Test instance = initInstance();
private static final String str2 = new String("en");
private static final String str3 = "en";
private Test() {
}
public static void main(String[] args) {
}
private static Test initInstance() {
instance = new Test();
System.out.println(str1 + ',' + str2 + ',' + str3);
return instance;
}
}