虚拟机不会初始化类的三种情况

子类使用父类的静态字段时,只有直接定义这个字段的父类会被初始化。

public class JVMTest {
    public static void main(String[] args) {
        System.out.println(Son.a);
    }
}

class Father{
    public static int a=1;

    static {
        System.out.println("父类初始化");
    }
}

class Son extends Father{

    static {
        System.out.println("子类初始化");
    }
}

结果:子类未被初始化

在这里插入图片描述


通过数组定义来使用类。

定义单独一个对象

public class JVMTest {
    public static void main(String[] args) {
        Father father=new Father();
    }
}

class Father{
    public static int a=1;

    static {
        System.out.println("父类初始化");
    }
}

父类被初始化了
在这里插入图片描述
通过数组定义

public class JVMTest {
    public static void main(String[] args) {
        Father[] fathers=new Father[10];
    }
}

class Father{
    public static int a=1;

    static {
        System.out.println("父类初始化");
    }
}

不会初始化
在这里插入图片描述


常量在编译期会存入调用类的常量池,因此不会初始化定义常量的类。

public class JVMTest {
    public static void main(String[] args) {
        System.out.println(Father.b);
    }
}

class Father{
    public static int a=1;
    public static final int b=1;
    static {
        System.out.println("父类初始化");
    }
}

定义常量b的Father类没有被初始化
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41112238/article/details/105887154