类加载器加载顺序

先上代码:

public class Parent {

    {
        System.out.println("Parent的普通代码块");
    }

    static {
        System.out.println("Parent的静态代码块");
    }

    public Parent() {
        System.out.println("Parent的构造代码块");
    }

    public static void staticMethod1() {
        System.out.println("Parent的静态代方法1");
    }

    public static void staticMethod2() {
        System.out.println("Parent的静态代方法2");
    }
}

测试类:

    public static void main(String[] args) {
        Parent.staticMethod1();
        Parent.staticMethod2();
        Parent parent = new Parent();
    }

结果:

Parent的静态代码块
Parent的静态代方法1
Parent的静态代方法2
Parent的普通代码块
Parent的构造代码块

来个子类:

public class Child extends Parent {
    {
        System.out.println("Child的普通代码块");
    }

    static {
        System.out.println("Child的静态代码块");
    }

    public Child() {
        System.out.println("Child的构造代码块");
    }

    public static void staticMethod1() {
        System.out.println("Child的静态代方法1");
    }

    public static void staticMethod2() {
        System.out.println("Child的静态代方法2");
    }
}

测试一下:

    public static void main(String[] args) {
        Child.staticMethod1();
        Child.staticMethod2();
        Child child = new Child();
    }

结果:

Parent的静态代码块
Child的静态代码块
Child的静态代方法1
Child的静态代方法2
Parent的普通代码块
Parent的构造代码块
Child的普通代码块
Child的构造代码块

加载顺序:
父类的静态代码块–> 子类的静态代码块 -->父类的普通代码块 -->父类的默认构造器 -->子类的普通代码块 -->子类的构造器

子类静态方法加载在子类静态代码块之后,父类的普通代码块之前

你可能感兴趣的:(JVM)