猿问

类加载,静态块

我有这段代码,我正在使用 -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");

    }


}

输出:

噜噜哒
浏览 106回答 2
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)。这些选项均不适用于您的情况,因此不会调用静态块。

阿波罗的战车

简单版本:静态块仅在您第一次创建对象或访问该类的静态成员时运行。
随时随地看视频慕课网APP

相关分类

Java
我要回答