首先有一下程式碼:
public class Demo{ public static void main(String []args){ int i=12; i=i++; System.out.println(i); } }
你可以試想這段程式碼是多少 大多數同學可能會回答是13,然而事實並非如此,如下圖結果:
在上圖中,我首先進行了運行,可以看到結果,我們的i並不是如大多人猜測的那樣為13輸出,而是看起來沒有做這個自增的操作,然而這是為什麼呢?
於是,就有了後面反編譯為字節碼的操作,我們利用javap 指令反編譯後可以看清楚其中發生的事情,有同學對其中的JVM指令不清楚,沒關係,我這裡先普及一下本文程式碼中所涉及的JVM指令;
(這裡的關鍵指令碼在於main方法之後,因此只針對於下面的指令進行解釋,其之前的是虛擬機自動構建的預設建構方法的指令碼)
1.bipush: 將單字節的常數值(-128~127)推送到堆疊頂部
2.istore: 將堆疊頂部int型數值存入指定本地變數
3.iload: 將指定的int型本地變數推送至堆疊頂部
4.iinc: 此指令用於對本地(局部)變數進行自增減操作。此指令第一參數為本地變數的編號,第二個參數為自增減的數量
# 5.getstatic 取得指定類別的靜態域,並將其值壓入堆疊頂端(到這個位置之後就是呼叫靜態物件out列印的操作不再贅述,有興趣的同學可以在本文末尾附上的連結的去了解一下)
知道基本的幾個指令之後我們來分析上圖中關鍵指令的意思吧:
bipush 12這裡是把12推到棧頂堆疊裡儲存了12 這個int數值
以上是深層理解在java中的 '”i=i++;”的運算結果及運作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!