jvm引數
我們可以看到新增了final修飾符後的結果並沒有執行靜態**塊的程式,首先我們知道final本身它表示是乙個常量,str的值一旦被賦予之後就不能被改變了,常量在編譯階段就會被存入到呼叫這個常量的那個方法所在的類的常量池當中,在上面的例子看來就是存放到mytest2這個類的常量池,本質上,呼叫類並沒有直接引用到定義常量的類,因此並不會觸發該類的初始化,那麼myparent2該類的靜態**塊不會被執行
注意:str常量存放到了mytest2的常量池後,mytest2與myparent2就無任何關係了,我們
甚至可以將myparent2的class檔案刪除
可以看到輸出結果依然沒有發生任何的改變,這也就驗證了上面所說的結論,接著往下看
對mytest2進行反編譯看到結果:
getstatic助記符:就是對out這個靜態成員變數進行了訪問
我們還看到myparent2.str已經成為了確切的值(編譯時),並不用從myparent2中去取
ldc助記符:將int,float或是string型別的常量值從常量池中推送至棧頂
bipush:將單位元組(-128 - 127)的常量值推送至棧頂 例:shrot s=127
sipush:將乙個短整型常量值(-32768 - 32767)推送至棧頂 例:int s=128
iconst_1表示將int型別1推送至棧頂 (iconst_m1 - iconst_5 ) 例: int s=-1至5
JVM指令助記符
以下只是jvm指令助記符,關於jvm指令的詳細內容請閱讀 jvm指令詳解 變數到運算元棧 iload,iload lload,lload fload,fload dload,dload aload,aload 運算元棧到變數 istore,istore lstore,lstore fstore,fs...
JVM 指令助記符
iconst m1 iconst 0 iconst 1 iconst 2 iconst 3 iconst 4 iconst 5 lconst 0 lconst 1 fconst 0 fconst 1 dconst 0 dconst 1 bipush sipush ldc ldc w ldc2 w l...
JVM指令助記符
以下只是jvm指令助記符,關於jvm指令的詳細內容請閱讀 jvm指令詳解 變數到運算元棧 iload,iload lload,lload fload,fload dload,dload aload,aload 運算元棧到變數 istore,istore lstore,lstore fstore,fs...