Java-奇怪的静态字符串行为-新字符串(";xxx";)与";xxx“;

Java-奇怪的静态字符串行为-新字符串(";xxx";)与";xxx“;,java,string,static,initialization,Java,String,Static,Initialization,理论上如果到处都是静力学,它会导致“恩,恩,恩” 结果:“en,null,en” 预期为:“en,null,null”(因为我发现静态顺序实际上很重要) 有人能解释一下吗? “en”和新字符串(“en”)有什么不同。在调用该方法时,str2尚未初始化(字段按声明顺序初始化),str3是编译时常量 编译时常量由编译器在类文件中内联。新字符串(“..”)不是常量,因为它使用构造函数 字符串常量由字符串文本“”定义,它们被放置在jvm实例的字符串池中,以便重用。与此相反,使用新字符串(..)会创建一个

理论上如果到处都是静力学,它会导致“恩,恩,恩”

结果:“en,null,en”

预期为:“en,null,null”(因为我发现静态顺序实际上很重要)

有人能解释一下吗?
“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;
    }
}