91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java虛擬機指令dup詳解

發布時間:2020-09-11 15:24:12 來源:腳本之家 閱讀:184 作者:CLAYJJ 欄目:編程語言

本文實例為大家介紹了java虛擬機指令dup,供大家參考,具體內容如下

舉個例子:

public class ExceptionTest{

  void cantBeZero(int i) throws Exception{
    throw new Exception();

  }

}

上面代碼編譯后的字節碼指令如下:

void cantBeZero(int) throws java.lang.Exception;
  descriptor: (I)V
  flags:
  Code:
   stack=2, locals=2, args_size=2
    0: iload_1
    1: ifne     12
    4: new      #2         
    // class java/lang/Exception
    7: dup
    8: invokespecial #3         
    // Method java/lang/Exception."<init>":()V
    11: athrow
    12: return

1) 其中new指令在java堆上為Exception對象分配內存空間,并將地址壓入操作數棧頂;

2) 然后dup指令為復制操作數棧頂值,并將其壓入棧頂,也就是說此時操作數棧上有連續相同的兩個對象地址;

3) invokespecial指令調用實例初始化方法<init>:()V,注意這個方法是一個實例方法,所以需要從操作數棧頂彈出一個this引用,也就是說這一步會彈出一個之前入棧的對象地址;

4) athrow指令從操作數棧頂取出一個引用類型的值,并拋出;

5) 最后由return指令結束方法。

從上面的五個步驟中可以看出,需要從棧頂彈出兩個實例對象的引用,這就是為什么會在new指令下面有一個dup指令,其實對于每一個new指令來說一般編譯器都會在其下面生成

一個dup指令,這是因為實例的初始化方法肯定需要用到一次,然后第二個留給程序員使用,例如給變量賦值,拋出異常等,如果我們不用,那編譯器也會生成dup指令,在初始化方法調用完成后再從棧頂pop出來。例如我們僅僅創建一個對象而不做任何操作,例如:

 void cantBeZero(int i) throws Exception{
     new Exception();
 
  }

上面的代碼僅僅創建了一個Exception對象,而沒有做任何操作。

其編譯后的字節碼指令如下:

void cantBeZero(int) throws java.lang.Exception;
  descriptor: (I)V
  flags:
  Code:
   stack=2, locals=2, args_size=2
    0: new      #2         // class java/lang/Exception
    3: dup
    4: invokespecial #3     // Method java/lang/Exception."<init>":()V
    7: pop
    8: return

也會生成一個dup指令,只不過在調用完實例初始化方法后,將重復的實例引用又pop出棧了。不過這種情況基本不會出現在我們的代碼中,因為我們創建的每一個對象都應該是有用的。

通過上面的例子你應該比較清楚的理解了為什么創建對象時總會有一個dup指令了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

化州市| 林口县| 洪洞县| 当涂县| 米泉市| 南澳县| 尚志市| 雅江县| 寻甸| 博白县| 老河口市| 宁陵县| 新龙县| 武平县| 曲麻莱县| 吐鲁番市| 昭通市| 罗田县| 高陵县| 枞阳县| 云龙县| 余干县| 马关县| 葵青区| 旌德县| 平阴县| 象州县| 雅安市| 吉隆县| 屏东市| 新营市| 高台县| 洛扎县| 伊吾县| 西昌市| 万载县| 佳木斯市| 青岛市| 望奎县| 丰宁| 邓州市|