【发布时间】:2014-08-18 19:53:20
【问题描述】:
根据最后的注释here:
"如果原始类型或字符串被定义为常量并且值在编译时已知,则编译器会用其值替换代码中各处的常量名称。这称为编译时常量. 如果外界常量的值发生变化(例如,如果规定 pi 实际上应该是 3.975),则需要重新编译任何使用该常量的类来获取当前值。"
假设我在class A 中定义了一个公共常量PI (public static final double PI=3.14),并且
在class B 中使用了这个常量PI。
所以 - 根据上面的规范,如果我将 PI 的值从 3.14 更改为,比如 class A 中的 3.0,我必须重新编译 class B 以获得 class B 中更改的效果.
这里的问题是——上述规范中“常数”的确切定义是什么?
是final 关键字吗?在这种情况下,是否有任何static 字段成员“有资格”作为常量?
非静态字段成员在这里会脱离上下文——它们的值是在运行时分配的(?)
TIA。
//============================
编辑:
这里的问题是:是什么让编译器决定在编译时绑定值。 static 关键字本身是否可以完成这项工作。或者还有其他东西。
//=========================
参考下面不断获得投票的快速答案:
同一页的行:
“static修饰符,与final修饰符结合,也用于定义常量。final修饰符表示该字段的值不能改变。”
1.) “...也用于定义常量。...”:还有什么定义常量。
2.) “... 与最终修饰符组合”:final 是在编译时绑定值所必需的——我怀疑它是。
【问题讨论】:
-
我建议改用
Math.PI。 -
+1,不是因为问题本身,而是因为 TIL 更改
static final类成员的值会破坏二进制兼容性!