1. 程式人生 > 其它 >反射(3)

反射(3)

分析類的初始化

package com.reflection;

/**
 * 類的主動引用(一定會發生類的初始化)
 *      當虛擬機器啟動,先初始化main方法所在類
 *      new一個類的物件
 *      呼叫類的靜態成員(除了final常量)和靜態方法
 *      使用java.lang.reflect包的方法對類進行反射呼叫
 *      當初始化一個類,如果其父類沒被初始化,那麼會先初始化父類
 * 類的被動引用(不會發生類的初始化)
 *      當訪問一個靜態域時,只有真正宣告這個域的類才會被初始化。比如:通過子類引用父類的靜態變數,不會導致子類初始化
 *      通過陣列定義類引用,不會觸發此類的初始化
 *      引用常量不會觸發此類的初始化
 
*/ public class Test04 { static { System.out.println("main類被載入"); } public static void main(String[] args) throws ClassNotFoundException { System.out.println("================"); //1.主動引用 //Son son = new Son();//----------------------------------------①和②結果一樣 System.out.println("================");
//2.反射也會產生主動引用 Class.forName("com.reflection.Son");//---------------------------②和①結果一樣 System.out.println("================"); //3.不會產生類的引用的方法 System.out.println(Son.b); Son[] array = new Son[5]; System.out.println(Son.M); } } class Father{ static
int b = 2; static{ System.out.println("父類被載入"); } } class Son extends Father{ static{ System.out.println("子類被載入"); m = 300; } static int m = 100; static final int M = 1; }