亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

類加載,靜態塊

類加載,靜態塊

嚕嚕噠 2023-03-31 14:40:43
我有這段代碼,我正在使用 -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)。

這些選項均不適用于您的情況,因此不會調用靜態塊。


查看完整回答
反對 回復 2023-03-31
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

簡單版本:靜態塊僅在您第一次創建對象或訪問該類的靜態成員時運行。



查看完整回答
反對 回復 2023-03-31
  • 2 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號