Re: [問題] static runtime問題
推
12/21 12:34,
12/21 12:34
→
12/21 12:36,
12/21 12:36
→
12/21 12:37,
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
----------
回到正題,為何 static field 可以透過 instance 呼叫,只會出現警告而
不會有錯誤呢? 因為編譯器也幫你找到你的 instance 是哪個 class 在編譯時
轉換好了: PS : 重申,我只能確定 Oracle 的 JDK 會幫你做
請直接參考圖片:http://ppt.cc/6bZX
左邊是 Source Code , 中間是 ByteCode
右邊是根據 ByteCode decompile 回來的 Source Code
在 .java 先使用 TEST.StaticInt=1 存取 static field
接著再用一個 TEST 的實體 t 存取 StaticInt
為了比較,另外也存取了一個 InstanceInt
在 Byte Code 的地方可以看到底下
t.StaticInt=2 和
t.InstanceInt=2
所使用的 opcode 不同
一個是 putfield (對 InstanceInt)
一個是 putstatic (對 StaticInt)
而根據這個 byte code 編譯回來的 source code (右邊)
也可以看出其實編譯器在編譯的時候,已經幫你把 t.StaticInt=2
轉成 TEST.StaticInt 了
至於為什麼會提出警告嘛... 我猜應該是怕妳自己會搞不清楚吧
舉個例子,猜猜看這樣會印出啥呢?
http://pastie.org/9792378
解答: http://ideone.com/sZ3aXb ( 印象中 SCJP 會考這種東西 )
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.138.115.115
※ 文章網址: http://www.ptt.cc/bbs/java/M.1419140902.A.C90.html
※ 編輯: darkk6 (223.138.115.115), 12/21/2014 14:00:33
推
12/21 14:12, , 1F
12/21 14:12, 1F
→
12/21 14:32, , 2F
12/21 14:32, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章