我有這段代碼,我正在使用 -verbose:class 選項運行它以查看加載的類。令我驚訝的是,它顯示它加載了 A1 和 A2 類,但未調用靜態塊。有人可以解釋這種行為嗎package P1;import java.lang.reflect.InvocationTargetException;public class DemoReflection { static { System.out.println("Loading Demo"); } public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { System.out.println("A2 " + A2.class.getClassLoader().getClass()); System.out.println("Demo " + DemoReflection.class.getClassLoader().getClass()); System.out.println("A1 " + A1.class.getClassLoader().getClass()); }}class A1 { static { System.out.println("Loading A1"); }}class A2 extends A1 { static { System.out.println("Loading A2"); } public A2() { System.out.println("m2"); } public void m1() { System.out.println("m1"); }}class A3 { static int a3Id = 3; static { System.out.println("Loading A3"); }}輸出:
2 回答

湖上湖
TA貢獻2003條經驗 獲得超2個贊
JLS?§8.7說:
在類中聲明的靜態初始值設定項在類初始化時執行(第 12.4.2 節)。
那么初始化是什么意思呢?讓我們參考JLS §12.4.2。這描述了詳細的初始化過程。然而, JLS §12.4.1點在這里可能更合適。它說:
類或接口類型 T 將在以下任何一項第一次出現之前立即初始化:
T 是一個類,并且創建了 T 的一個實例。
T 是一個類,調用了 T 聲明的靜態方法。
分配了 T 聲明的靜態字段。
使用了由 T 聲明的靜態字段,并且該字段不是常量變量(第 4.12.4 節)。
T 是頂級類(§7.6),執行詞法嵌套在 T(§8.1.3)中的斷言語句(§14.10)。
這些選項均不適用于您的情況,因此不會調用靜態塊。
添加回答
舉報
0/150
提交
取消