Java语言文档中写道:
如果原始类型或字符串被定义为常量,并且在编译时已知其值,则编译器会在代码中的所有位置将常量名称替换为其值。这称为编译时常量。
我的理解是,如果我们有一段代码:
private final int x = 10;
接着,编译器会将代码中每个x
的出现替换成字面值10
。
但是假设这个常量在运行时被初始化:
private final int x = getX(); // here getX() returns an integer value at run-time.
与编译时常量相比,是否会有任何性能下降(无论多么微不足道)?
另一个问题是下面这行代码:
private int y = 10; // here y is not final
编译器将final static视为编译时常量,而只有final会在运行时初始化为常量,只有static会在运行时初始化。如果没有final,则是一个变量而不是常量。