JAVA类实例化时,子类和父类中的构造方法,静态代码块,代码块和普通方法的调用顺序

通过这篇文章总结一下JAVA类实例化时,子类和父类中的构造方法,静态代码块,代码块和普通方法的调用顺序,首先编写两个测试类:

父类:

public class Father {
    {
        System.out.println("父类代码块");
    }
    static {
        System.out.println("父类静态代码块");
    }
    public Father(){
        System.out.println("父类构造方法");
        hehe();
    }
    public void hehe(){
        System.out.println("父类hehe方法");
    }
}

子类:

public class Son extends Father{
    {
        System.out.println("子类代码块");
    }
    static {
        System.out.println("子类静态代码块");
    }
    public Son(){
        System.out.println("子类构造方法");
        hehe();
    }
    public void hehe(){
        System.out.println("子类hehe方法");
    }
}

测试方法:

public class Main {
    public static void main(String[] args) {
        Son s = new Son();
    }
}

输出的顺序是:

父类静态代码块
子类静态代码块
父类代码块
父类构造方法
子类hehe方法
子类代码块
子类构造方法
子类hehe方法

其实规律也很简单,只有以下几条:

  1. 静态代码块在类加载时就会被执行;
  2. 子类的构造方法中会默认加上调用父类构造器的方法super(),并且加在构造器代码的第一行;
  3. 普通代码块的方法会被编译进构造器,并加在super()的后面;
  4. 调用类中的其他方法会默认加上this。

根据规则1,所以首先输出的是静态代码块中的内容,然后根据规则2,Son中调用super(),所以会先调用Father的构造器。又根据规则3,所以先输出父类普通代码块中的内容,再输出父类构造器的内容;父类中调用hehe(),调用方式可以看成this.hehe(),此时的this为Son,所以输出的是Son的hehe方法。接下来在输出Son中的代码块和构造方法的内容,最后输出Son的hehe方法内容。

你可能感兴趣的:(java基础)