Re: [問題] static runtime問題

看板java作者 (Mr. Pan)時間10年前 (2014/12/21 13:48), 10年前編輯推噓1(101)
留言2則, 2人參與, 最新討論串3/3 (看更多)

12/21 12:34,
我比較好奇的是,既然static member不需要instance,就
12/21 12:34

12/21 12:36,
可以呼叫使用,那為啥在撰寫的時候,卻可以使用instance
12/21 12:36

12/21 12:37,
來呼叫呢?(有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 ---------- 回到正題,為何 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
發現我的 Son 打錯了 ..... 變太陽了 O.O
12/21 14:32, 2F
文章代碼(AID): #1KbbycoG (java)
討論串 (同標題文章)
文章代碼(AID): #1KbbycoG (java)