作者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
推 PsMonkey:不需要執行 static block 不是很好嗎? 反正值都確定了 02/10 17:28
→ sbrhsieh:只有 primitive type 與 String type final field 是這樣 02/10 19:59
→ sbrhsieh:其初始值是直接存在 class bytecode 裡。 02/10 20:01
→ NewSpec:got it! 謝謝解惑! 02/10 20:14
→ sbrhsieh:我講得太過粗略,也不十分正確,補個文~~ 02/10 23:35
→ cha122977:我的想法是沒有final的話可能在static block內有更動 02/11 02:27
→ cha122977:所以設計上存取非final的變數會先進行initalize 02/11 02:29