最终成员在声明中分配常量是否在运行时优化到'静态最终版?

GKe*_*lly 2 java optimization

当我在Java代码中定义常量值时,我通常会将它们声明为"private static final",但最近我一直在维护代码,其中常量被定义为"private final".

我现在正在优化,并想知道是否要"静态化"这些.

例如

public class X {
    private final String SOME_CONST = "Whatever";
}
Run Code Online (Sandbox Code Playgroud)

以上代码是否与以下代码等效(在运行时),因此只保留了1个'SOME_CONST'副本?

public class X {
    private static final String SOME_CONST = "Whatever";
}
Run Code Online (Sandbox Code Playgroud)

我原本以为这是相当基本的,但我无法在任何地方找到答案.

[编辑]有些人回答了被实习的String实例.对不起,我应该选择一个更好的例子,在我看的情况下,它不仅仅是字符串,而是很多不同的类型(一些标准,一些用户定义).

我对'私人决赛'与'私人静态决赛'宣言的影响更感兴趣.

Ada*_*ter 5

SOME_CONST声明为非静态时,虚拟机将创建一个String内容为的实例"Whatever".但是,X该类的所有实例都将包含对此String对象的引用.因此,您只有一个实例String,但很多引用它.

将该字段设置为静态以避免不必要的引用可能是值得的.