[問題] 為什麼存取final欄位不會觸發initializer

看板java作者 (新規格)時間11年前 (2014/02/10 16:22), 編輯推噓1(106)
留言7則, 4人參與, 最新討論串1/2 (看更多)
直接看例子 // 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

02/10 17:28, , 1F
不需要執行 static block 不是很好嗎? 反正值都確定了
02/10 17:28, 1F

02/10 19:59, , 2F
只有 primitive type 與 String type final field 是這樣
02/10 19:59, 2F

02/10 20:01, , 3F
其初始值是直接存在 class bytecode 裡。
02/10 20:01, 3F

02/10 20:14, , 4F
got it! 謝謝解惑!
02/10 20:14, 4F

02/10 23:35, , 5F
我講得太過粗略,也不十分正確,補個文~~
02/10 23:35, 5F

02/11 02:27, , 6F
我的想法是沒有final的話可能在static block內有更動
02/11 02:27, 6F

02/11 02:29, , 7F
所以設計上存取非final的變數會先進行initalize
02/11 02:29, 7F
文章代碼(AID): #1I-8myTO (java)
文章代碼(AID): #1I-8myTO (java)