1. 程式人生 > >Java類載入及建立例項(new)順序

Java類載入及建立例項(new)順序

Java類載入

1.JVM( Java Virtual Machine,“Java虛擬機器” )的類裝載器ClassLoader(java類),包括系統類、擴充套件類、使用者編寫三種類載入器,負責將java的位元組碼檔案從硬碟讀取到JVM中(記憶體),即首次載入java類時,類的靜態成員開闢空間,將常量池存放在方法區記憶體中,對常量池地址解析,並對java類的靜態成員變數、靜態塊、靜態方法進行一次初始化。靜態資源在類載入到記憶體時,只加載一次,而new的物件和物件塊,每次都會載入。

2.在使用new關鍵字時,才會建立類的例項

   類例項(物件)的建立(構造):先構造父類物件,再構造子類物件

   物件構造步驟:

        ①遞迴的構造父類的物件(父類物件的構造也為①~③);

        ②順序地呼叫本類成員屬性賦初值語句;

        ③本類的構造方法。

3:物件銷燬:先銷燬子類,再銷燬父類

例如:

第一次載入類,類的靜態成員按照類中出現的順序載入:

父類ParentCL:

package com.classx;

public class ParentCL{
    //類靜態屬性
    public static int idp = staticForFieldByMethodOfP();
    //構造方法
    public ParentCL(){
        System.out.println("父類構造方法-執行");
    }
    //非靜態初始化塊
    {
        System.out.println("父類的非靜態初始化塊-執行");
    }
    //靜態初始化塊
    static{
        System.out.println("父類的靜態初始化塊-執行");
    }
    //類靜態方法
    public static void staticMethodByP(){
        System.out.println("父類的靜態方法-執行");
    }
    //類靜態方法
    public static int staticForFieldByMethodOfP(){
        System.out.println("父類的靜態屬性-執行");
        return 4466;
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("父類銷燬方法");
        super.finalize();
    }
}

子類ChildCL:

package com.classx;

public class ChildCL extends ParentCL{
    //類靜態屬性
    public static int idc = staticForFieldByMethodOfC();
    //構造方法
    public ChildCL(){
        System.out.println("子類構造方法-執行");
    }
    //非靜態初始化塊
    {
        System.out.println("子類的非靜態初始化塊-執行");
    }
    //靜態初始化塊
    static{
        System.out.println("子類的靜態初始化塊-執行");
    }
    //類靜態方法
    public static void staticMethodByC(){
        System.out.println("子類的靜態方法-執行");
    }
    //類靜態方法
    public static int staticForFieldByMethodOfC(){
        System.out.println("子類的靜態屬性-執行");
        return 5555;
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("子類銷燬方法");
        super.finalize();
    }
}

類載入呼叫:

package com.classx;

public class Classxloadernew {
    public static void main(String[] args) {
        ParentCL.staticMethodByP();
    }
}

輸出為:
父類的靜態屬性-執行
父類的靜態初始化塊-執行
父類的靜態方法-執行
new使用測試:

package com.classx;

public class Classxloadernew {
    public static void main(String[] args) {
        ChildCL ccl = new ChildCL();
    }
}

 輸出為:

父類的靜態屬性-執行
父類的靜態初始化塊-執行
子類的靜態屬性-執行
子類的靜態初始化塊-執行
父類的非靜態初始化塊-執行
父類構造方法-執行
子類的非靜態初始化塊-執行
子類構造方法-執行
銷燬測試:

package com.classx;

public class Classxloadernew {
    public static void main(String[] args) {
        ChildCL ccl = new ChildCL();
        ccl = null;
        System.gc();
    }
}

輸出為:

父類的靜態屬性-執行
父類的靜態初始化塊-執行
子類的靜態屬性-執行
子類的靜態初始化塊-執行
父類的非靜態初始化塊-執行
父類構造方法-執行
子類的非靜態初始化塊-執行
子類構造方法-執行
子類銷燬方法
父類銷燬方法