看代碼:

檢查程序,是否存在問題,若是存在指出問題所在,若是不存在,說明輸出結果。this

public class Inc {

    public static void main(String[] args) {

        Inc inc = new Inc();
        int i = 0;
        inc.fermin(i); //這裏執行後 i==0  沒有異議
        i = i++;  // 注意這裏的執行:見下文 ##1
        System.out.println(i);
    }

    void fermin(int i) {
        i++;
    }
}
  • 執行結果爲:0
    • ##1( i = i++; )
      • 0: iconst_0索引

        1: istore_1class

        2: iload_1變量

        3: iinc          1, 1引用

        6: istore_1程序

        7: iload_1方法

    • 第0:將int類型的0入棧,就是放到操做數棧的棧頂static

    • 第1:將操做數棧棧頂的值0彈出,保存到局部變量表 index (索引)值爲1的位置。co

      • (局部變量表也是從0開始的,0位置通常保存當前實例的this引用,固然靜態方法例外,由於靜態方法是類方法而不是實例方法)new

    • 第2:將局部變量表index 1位置的值的副本入棧。(這時局部變量表index爲1的值是0,操做數棧頂的值也是0)

    • 第3:iinc是對int類型的值進行自增操做,

      • 後面第一個數值1表示,局部變量表的index值,說明要對此值執行iinc操做,

      • 第二個數值1表示要增長的數值。

      • (這時局部變量表index爲1的值由於執行了自增操做變爲1了,可是操做數棧中棧頂的值仍然是0)

    • 第6:將操做數棧頂的值彈出(值0),放到局部變量表index爲1的位置(舊值:1,新值:0),覆蓋了上一步局部變量表的計算結果。

    • 第7:將局部變量表index 1位置的值的副本入棧。(這時局部變量表index爲1的值是0,操做數棧頂的值也是0)

相關文章
相關標籤/搜索