为了账号安全,请及时绑定邮箱和手机立即绑定

类加载,静态块

类加载,静态块

噜噜哒 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 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信