這篇文章主要為大家展示了“java中整型常量和整型變量的區別有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java中整型常量和整型變量的區別有哪些”這篇文章吧。
成都創新互聯公司專業為企業提供密山網站建設、密山做網站、密山網站設計、密山網站制作等企業網站建設、網頁設計與制作、密山企業網站模板建站服務,十余年密山做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。我下圖代碼第五行和第九行分別定義了一個整型變量和一個整型常量:
static final int number1 = 512;
static int number3 = 545;
Java程序員都知道兩者的區別。
下面我們就用javap將.class文件反編譯出來然后深入研究Java里整型變量和整型常量的區別。
使用命令行javap -c constant.ConstantFolding查看.class文件反編譯出來的字節碼:
結果:
這些字節碼指令的說明,在wikipedia里有說明:
wiki: https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
咱們Java程序員不需要把它們都背下來,只需要把這個網頁收藏起來,要用的時候當成字典來用就行:
sipush 545: 將整數545放置到棧上
putstatic #16:
將棧上的值545賦給當前類的靜態字段里。
那么putstatic #16里的#16代表什么含義?
我們再用javap -v 參數反編譯,就能看到這個類的常量池(Constant pool). 大家看下圖藍色高亮的一行:
constant/ConstantFolding.number3:I
說明#16代表類constant.ConstantFolding的成員number3,類型為I。
至此,這兩行字節碼指令聯合起來,實際對應了我們寫的Java代碼:
static int number3 = 545;
我們繼續分析javap反編譯出來的字節碼。
aload_0: 將序號為0的本地變量的引入加載到棧上
invokespecial: 調用對象實例上的成員方法,如果有返回值,方法的返回值存儲到棧上。具體調用的方法由#標識,可在常量池中查詢到對應的方法名。
ldc: 將常量池上代號為#<數字>的常量的值從常量池加載到棧上。
我們從下圖的常量池列表能發現,序號為#29的常量318976正是整型常量number1(512)和整型常量(623)的積。由此可以看出, number1 * number2這個表達式,因為參與運算的兩個操作數通過STATIC和FINAL修飾成為了整型常量,因此其積在編譯期就能得到,所以編譯器在編譯時就計算出來,存儲在變量池里,序號為#29。
那么整型變量做乘法運算,對應的字節碼又是什么樣的呢?
從下圖序號為3的code開始:
getstatic #16: 將類的靜態成員#16加載到棧上。#16對應的成員為number3,值為545。
getstatic #18: 將類的靜態成員#18加載到棧上。#18對應的成員為number4,值為619。
imul: 執行棧上兩個整數的乘法運算。
istore_2: 將結果保存到局部變量2里。
此時,我們Java代碼里的int product2 = number3 * number4就執行完了。
大家看到的剩下的藍色字節碼,都對應了下面這行打印語句。
System.out.println("Value: " + product1 + " , " + product2);
從這些字節碼也能看出,Java里我們直接用加號進行字符串拼接操作,Java編譯器在編譯時,自動使用了StringBuilder進行優化。
既然整型變量的乘積需要打印出來,因此字節碼的iload_2將之前用istore_2保存在局部變量2中的計算結果又加載到棧上,這樣乘積結果最后就能輸出了。
以上是“java中整型常量和整型變量的區別有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯-成都網站建設公司行業資訊頻道!
網頁標題:java中整型常量和整型變量的區別有哪些-創新互聯
當前URL:http://m.newbst.com/article18/deojgp.html
成都網站建設公司_創新互聯,為您提供建站公司、網站改版、虛擬主機、面包屑導航、微信公眾號、品牌網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯