一尘不染

Java 编译时常量和变量

java

Java语言文档说:

如果将原始类型或字符串定义为常量,并且在编译时知道该值,则编译器会使用其值替换代码中各处的常量名称。这称为编译时常量。

我的理解是,如果我们有一段代码:

private final int x = 10;

然后,编译器会将x代码中每次出现的内容替换为literal 10。

但假设常量在运行时初始化:

private final int x = getX(); // here getX() returns an integer value at run-time.

与编译时常量相比,性能是否会下降(无论可以忽略不计)?

另一个问题是下面的代码行:

private int y = 10; // here y is not final

被编译器以与编译时常量相同的方式处理?

最后,我从答案中了解到的是:

  1. final static 表示编译时常数
  2. 只是final意味着它是一个常量,但是在运行时初始化
  3. 只是static意味着在运行时初始化
  4. 没有final是变量,不会被视为常量。

我的理解正确吗?


阅读 360

收藏
2020-03-21

共1个答案

一尘不染

编译时间常数必须为:

  • declared final
  • primitive or String
  • initialized within declaration
  • initialized with constant expression

所以private final int x = getX();不是恒定的。

第二个问题private int y = 10;不是恒定的(在这种情况下是非最终的),因此优化程序无法确定该值将来不会更改。因此,它无法将其优化为恒定值。答案是:不,它与编译时间常数的处理方式不同。

2020-03-21