首次建立類對象或者調用類的靜态成員/方法(包括入口main函數)時,java會加載類,類加載的步驟如下:
加載->驗證->準備->解析->初始化->使用->解除安裝
1.加載
1)java編譯器加載類的二進制位元組流(.class檔案);(如果該類有基類,基類還有自身的基類,加載的順序為根基類的class檔案,以此加載各導出類;不管基類是否使用都會加載);
2)将二進制位元組流的靜态存儲結構轉化成方法區的資料結構;
3)在記憶體生成該類的java.lang.Class對象,作為方法區中該類的入口
2.驗證
確定class檔案中位元組流符合虛拟機的要求
3.準備
為類靜态變量配置設定存儲空間,初始化(如果有基類,順序為根基類的靜态成員初始化,然後是各導出類的靜态成員初始化;)
4.解析
将常量池内的符号引用替換為直接引用
5.初始化
如果需要建立類執行個體,則會執行初始化,步驟如下:
1)初始化根基類的非靜态成員,執行根基類的構造函數;
2)初始化導出類的非靜态成員,執行導出類的構造函數;
6.使用
7.解除安裝
GC回收方法區中該類
package chapter7;
class Base{
//static field
static int printInit(String s){
System.out.println(s);
return 1;
}
private static int i = printInit("Base static i");
//non-static field
private int print(String s){
System.out.println(s);
return 1;
}
private int noni=print("Base non-static noni");
//construction
public Base(){
System.out.println("Base constructor");
}
}
public class ExtendClass extends Base{
//static field
static int printInit(String s){
System.out.println(s);
return 1;
}
private static int i1 = printInit("ExtendClass static i1");
private static int i2 = printInit("ExtendClass static i2");
//non-static field
private int print(String s){
System.out.println(s);
return 1;
}
private int noni1=print("ExtendClass non-static noni1");
private int noni2=print("ExtendClass non-static noni2");
//construction
public ExtendClass(){
System.out.println("ExtendClass constructor");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("new ExtendClass Instance");
ExtendClass ec=new ExtendClass();
}
}
輸出結果:
Base static i
ExtendClass static i1
ExtendClass static i2
new ExtendClass Instance
Base non-static noni
Base constructor
ExtendClass non-static noni1
ExtendClass non-static noni2
ExtendClass constructor
代碼中從執行ExtendClass的main方法處開始加載類和執行初始化