反射(3)
阿新 • • 發佈:2022-05-11
分析類的初始化
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{ staticint 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; }