看板 java 關於我們 聯絡資訊
剛剛在弄 compiler 的時候, 發現 java 對 static field 的 initialization 時機 可能會有潛藏的陷阱. 舉例來說: class A { static int a = 1; } interface B { static final int b = A.a; } class C implements B { static final int c = A.a; } class Test { public static void main(String... args) { C c = new C(); A.a++; System.out.println(C.b +","+ C.c); // 印出來是 2,1 } } JLS 裡說 Class 在產生 object instance 的時候, 所有自己的跟 super class 的 static fields 都必須先被 initialized, 但是 interface 並不需要; interface fields 基本上只會在第一次被用到的時候才被 initialized. 所以上面的 C.c 在 new C() 的時候就被 initialize, 那時 A.a 的值是 1, 而 C implements B 裡的 B.b 卻還沒有被 initialized; 直到 println 時 C.b (就是 B.b) 才第一次被使用到, 這時 A.a 的值已經是 2 了. 實務上這好像不會造成什麼問題, 因為即便是沒有經驗的初學者, 一旦知道 interface field 一定是 static final 的以後, 直覺上就是把它當成 constant 來用, 很少會有狀況想用變數來當成初始值, 所以 initialization 的時機並沒什麼差別. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.90.52
kene:真神奇, 我還真的沒想過程式會有人這樣寫 XD 06/07 20:09
qrtt1:又認識了一些新知 :D 06/07 20:41
PttTime:萬歲 06/08 21:25