推 icydream: 我比較好奇的是,既然static member不需要instance,就 12/21 12:34
→ icydream: 可以呼叫使用,那為啥在撰寫的時候,卻可以使用instance 12/21 12:36
→ icydream: 來呼叫呢?(有warning,但不影響執行) 12/21 12:37
PS : 底下都是在 Oracle 的 JDK 的結果,其他 Compiler 會不會幫你做 我就沒研究了
這個其實和 AutoBoxing 一樣,是 Java Compiler 幫你做的事情
Keyword : Compiler Sugar 別只顧著吃糖阿...
這邊要注意到一點,就是你寫的 Code 並不是 100% 按照 Source Code
編譯成 .class 檔案,直接舉 AutoBoxing 來說,你寫的 Code 是這樣:
Integer a=1;
經過編譯器的時候先幫你 Boxing 變成
Integer a = Integer.valueOf(1);
所以實際寫進 .class 的內容是
04 B8 00 02 4C B1 綠色的部分不一定,那是 method ref. index
PS : 參考 Java Byte Code
http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
04 = iconst_1 // 將常數 1 放進 stack
B0 00 02 = invokestatic #2 // 將 stack 的職傳入 Method No2 執行
// 在這裡 Method No2 是 Integer.valueOf
C4 = astore_1 // 將 reference 儲存到編號1的變數
B1 = return 是因為我的 main 裡面只有這一行,所以到底了要 return
參考圖片:
http://ppt.cc/Fte5