作者NewSpec (新规格)
看板java
标题[问题] 为什麽存取final栏位不会触发initializer
时间Mon Feb 10 16:22:18 2014
直接看例子
// Test.java
public class Test
{
public static final int CONST = 10;
static {
System.out.println("initializer in Test");
}
}
// Main.java
public class Main
{
public static void main(String[] args){
System.out.println("Main.main() is called.");
System.out.println(Test.CONST);
}
}
// Output:
Main.main() is called.
10
但去掉Test.CONST宣告中的final後, output就成为了:
Main.main() is called.
initializer in Test
10
虽然说Java语言规格中有说明到: 对类别或界面中的常数的存取不会触发初始化
(§12.4.1)
但我还是想了解一下为什麽要做这样的限制
是效能的考量吗? 多谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.120.134.11
1F:推 PsMonkey:不需要执行 static block 不是很好吗? 反正值都确定了 02/10 17:28
2F:→ sbrhsieh:只有 primitive type 与 String type final field 是这样 02/10 19:59
3F:→ sbrhsieh:其初始值是直接存在 class bytecode 里。 02/10 20:01
4F:→ NewSpec:got it! 谢谢解惑! 02/10 20:14
5F:→ sbrhsieh:我讲得太过粗略,也不十分正确,补个文~~ 02/10 23:35
6F:→ cha122977:我的想法是没有final的话可能在static block内有更动 02/11 02:27
7F:→ cha122977:所以设计上存取非final的变数会先进行initalize 02/11 02:29