Java类加载及初始化顺序

代码及执行结果

父类

public class Parent {

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

    {
        System.out.println("父类非静态代码块");
    }

    public Parent() {
        System.out.println("父类构造函数");
    }

    public static void method01(){
        System.out.println("父类静态方法");
    }

    public void method02(){
        System.out.println("父类非静态方法");
    }
}

子类

public class Child extends Parent {

    public Child() {
        System.out.println("子类构造方法");
    }

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

    {
        System.out.println("子类非静态代码块");
    }

    public static void method01(){
        System.out.println("子类静态方法");
    }

    public void method02(){
        super.method02();
        System.out.println("子类非静态方法");
    }
}

测试类

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

执行结果

父类静态代码块
子类静态代码块
父类非静态代码块
父类构造函数
子类非静态代码块
子类构造方法
子类静态方法
父类非静态方法
子类非静态方法

总结

  1. 静态代码块于类开始加载到JVM虚拟机时调用,所以最先
  2. 类初始化时会先调用非静态代码块,再调用构造方法
  3. 子类初始化时必定调用父类初始化流程,如果子类中没有写super(),也会自动默认添加super(),如果super()不可用将报错提示使用可用的父类构造方法
  4. 父类静态方法不可被子类继承,引申凡是被static标记的都是与类绑定的,无法被继承
  5. 子类可以通过super指针显式调用父类被覆盖的方法

猜你喜欢

转载自blog.csdn.net/kylinaaa/article/details/88616066