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

溫馨提示×

溫馨提示×

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

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

怎么認識Java從虛擬機角度分析類的實例化順序

發布時間:2020-07-13 10:05:57 來源:億速云 閱讀:139 作者:Leah 欄目:編程語言

怎么認識Java從虛擬機角度分析類的實例化順序?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1、首先展示一下實例代碼(Son.java & Father.java)

public class Father {    
    public static int a=10;//父類的靜態變量    static{//父類的靜態代碼塊
        a=20;
    }
    {//父類的構造代碼塊
        a=30;
    }    
    public Father() {//父類的構造方法
        a=40;
    }
}
public class Son extends Father{    
    public static int s=10;//子類的靜態變量    public int k=20;//子類的實例變量    static{//子類的靜態代碼塊
        s=20;
    }
    {//子類的構造代碼塊
        s=30;
    }    public Son() {//子類的構造函數
        s=40;
    }
    {//子類的構造代碼塊
        s=50;
    }
}

2、將son.java文件編譯為son.class文件,然后使用javap反編譯查看Son的字節碼指令來分析Son的加載順序,更利于理解(javap -v -c Son > p.txt)。

3、執行代碼"new Son();"后,分析類的加載順序。

下面的static{};為<clinit>函數,son();為<init>函數。

static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: bipush        10
         2: putstatic     #11                 // Field s:I--------------------------順序執行靜態變量的賦值
         5: bipush        20
         7: putstatic     #11                 // Field s:I--------------------------順序執行靜態代碼塊
        10: return
  public packet1020.Son();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0         
         1: invokespecial #16                 // Method packet1020/Father."<init>":()V--------------------執行父類的<init>函數(順序不變,第一個)
         4: aload_0         
         5: bipush        20
         7: putfield      #18                 // Field k:I------------------------------------------------按順序收集實例變量賦值
        10: bipush        30
        12: putstatic     #11                 // Field s:I------------------------------------------------按順序收集構造代碼塊
        15: bipush        50
        17: putstatic     #11                 // Field s:I------------------------------------------------按順序收集構造代碼塊
        20: bipush        40
        22: putstatic     #11                 // Field s:I------------------------------------------------最后執行自己的構造函數代碼(順序不變,最后一個)
        25: return

開始分析:

1.觸發類的加載,在初始化階段,先執行父類<clinit>函數,然后執行子類<clinit>函數,按照順序執行靜態變量賦值與靜態代碼塊。

2.代碼中執行了構造函數,所以執行<init>函數。

結論:

1.父類中順序執行靜態變量賦值,靜態代碼塊

2.子類中順序執行靜態變量賦值,靜態代碼塊

3.父類中順序執行實例變量賦值,構造代碼塊

4.父類構造函數

5.子類中順序執行實例變量賦值,構造代碼塊

6.子類構造函數

名字解釋:摘抄自周志明老師的《深入理解Java虛擬機:JVM高級特性與最佳實踐》

1.有且只有4中情況下必須對類進行初始化(執行<clinit>函數)中的第三種:當初始化一個類時,先初始化父類。這就是為什么父類的<clinit>函數先于子類的<clinit>函數執行。

2.<clinit>函數:編譯器按照源代碼中的順序自動收集類中的所有靜態變量的賦值動作和靜態代碼塊中的語句合并而成的。

3.<init>函數:最開始先調用父類的<init>函數,然后編譯器按照源代碼中的順序自動收集類中的實例變量的賦值操作和構造代碼塊中的語句合并,然后插入到構造函數方法前面,最后是程序員自己寫的構造函數代碼。

構造代碼塊執行順序先于構造函數

<init>(){
  1.調用父類<init>方法
  2.順序執行實例變量的賦值操作和構造代碼塊
  3.程序員自己的構造函數方法代碼
}

看完上述內容,你們掌握怎么認識Java從虛擬機角度分析類的實例化順序的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

河南省| 大足县| 隆子县| 将乐县| 颍上县| 武义县| 海原县| 仪陇县| 饶河县| 潞西市| 金乡县| 铁岭市| 普定县| 深泽县| 新泰市| 辰溪县| 剑河县| 古交市| 柳河县| 南京市| 漯河市| 福建省| 红安县| 内黄县| 龙海市| 阜阳市| 阳原县| 邵武市| 临西县| 集贤县| 思茅市| 仙桃市| 永春县| 天峻县| 谷城县| 锡林浩特市| 年辖:市辖区| 霍城县| 冷水江市| 黄浦区| 竹溪县|