看板 java 關於我們 聯絡資訊
直接看例子 // 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