📜  说明Java继承中的类加载和静态块(1)

📅  最后修改于: 2023-12-03 15:28:10.767000             🧑  作者: Mango

Java继承中的类加载和静态块

类加载

在Java程序运行时,类需要被加载到内存中才能被使用。当程序中需要使用一个类时,类加载器会尝试将这个类的.class文件读入内存,然后在内存中创建一个表示这个类的Class对象。

Java中有三种类加载器:BootstrapClassLoader、ExtensionClassLoader和AppClassLoader。这三种类加载器按照嵌套子父级关系组成了一个称为类加载器层次结构的树形结构。当需要加载一个类时,先由自定义的AppClassLoader寻找类,如果没找到,则由其父类ExtensionClassLoader去加载,再没有找到由BootstrapClassLoader去加载。BootstrapClassLoader是JVM内置的类加载器,被称为根类加载器。在加载任何类之前,BootstrapClassLoader已经把rt.jar中的类加载到内存中,这些类是Java中最基本的类。

静态块

静态块是在类被加载进内存后,执行静态代码块内的内容,静态块只会被执行一次。

public class StaticDemo {
    public static void main(String[] args) {
        System.out.println(StaticExample.a);//输出"1"并未输出"2"
    }
}
class StaticExample {
    static int a = 1;
    static {
        a = 2;//静态块在类加载时执行,仅执行一次
        System.out.println(a);//输出"2"
    }
}

在继承中,父类在被子类继承时,会先进行父类的静态方法和静态代码块的加载:

public class Parent {
    static {
        System.out.println("父类静态块");
    }
}
public class Child extends Parent {
    static {
        System.out.println("子类静态块");
    }
    public static void main(String[] args) {
        new Child();
    }
}

输出的结果如下:

父类静态块
子类静态块

静态块先加载父类,再加载子类。

总结

类加载器是Java程序中负责将类加载到内存中的组件,Java中有三种类加载器:BootstrapClassLoader、ExtensionClassLoader和AppClassLoader。静态块是在类被加载进内存后,执行静态代码块内的内容,只会被执行一次。在继承中,父类的静态代码块会优先被加载。