類的載入過程
Java中一個類的資訊編譯之後是存放在位元組碼檔案中的(.class),啟動並執行時候,如果虛擬機器用到了這個類,它就會通過ClassPath找到這個位元組碼的檔案,通過一個輸入資料流,把其中的內容讀入到虛擬機器的記憶體中,從而獲得這個類的資訊,稱為類載入
類的加栽只會進行一次,第一次用到這個類的時候
靜態初始代碼塊在類載入的時候運行
類載入的時機:能不載入就不載入
1. 第一次new對象的時候,載入
2. 第一次訪問static成員的時候,載入
3. 聲明引用的時候,不會載入類
4. 載入字類會先載入父類
5. 如果通過子類訪問父類的靜態成員,只載入父類
6. 如果訪問的是類的公開的靜態常量,那麼如果編譯器在編譯的時候能確定這個常量的值的時候,那麼就不會載入,反之,編譯器不能確定值的時候,就載入
Code:
class A
{
static int i=20;
static final int j=50;
static double x=Math.random()*1000;
A()
{
System.out.println("A的建構函式");
}
{
System.out.println("class A的初始化塊");
}
static{
System.out.println("classA被載入");
}
}
class B extends A
{
B()
{
System.out.println("B的建構函式");
}
static
{
System.out.println("class b 被載入");
}
{
System.out.println("class b的初始化塊");
}
}
class TestClassLoader
{
public static void main(String[] args)
{
A a; //聲明一個引用的時候不載入類
a=new B(); //new 一個對象的時候被載入,先載入父類,後再載入子類
System.out.println(A.i); //當使用靜態成員變數的時候被載入
System.out.println(B.i); //通過子類去訪問父類的靜態成員的 時候,只載入父類
System.out.println(A.h); //由於是可確定的值,所以不載入類
System.out.println(A.x); //由於編譯的時候不確定具體的值,所以會載入類
}
}