天天看點

Java中類的加載和初始化

首次建立類對象或者調用類的靜态成員/方法(包括入口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方法處開始加載類和執行初始化