静态代码块、构造代码块、构造方法、静态方法等(父子类)执行顺序

验证结果:静态代码块>构造代码块>构造方法>静态方法>普通代码块

验证代码如下
public class Son extends Father {

    private String name;

    public Son(String name) {
        super(name);
        this.name = name;
        System.out.println("子类带参数构造");
    }

    public Son() {
        System.out.println("子类不带参数构造");
    }

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

    public void sayHello() {
        System.out.println("我是子类成员方法");
    }

    static {
        System.out.println("子类静态代码块1");
    }
    static {
        System.out.println("子类静态代码块2");
    }
    {
        System.out.println("子类构造代码快");
    }

    public static void main(String[] args) {
        System.out.println("-------------分隔线:执行无参对象创建及方法(第一次)-------------------");
        Father father1 = new Son();
        father1.sayHello();
        System.out.println("-------------分隔线:执行无参对象创建及方法(第二次)-------------------");
        Father father2 = new Son();
        father2.sayHello();
        System.out.println("-------------分隔线:执行带参对象创建及方法-------------------");
        Father father3 = new Son("Carson");
        father3.sayHello();
        System.out.println("-------------分隔线:执行静态方法-------------------");
        Son.say();
    }
}

class Father {
    private String name;

    public Father(String name) {
        this.name = name;
        System.out.println("父类带参数构造");
    }

    public Father() {
        System.out.println("父类不带参数构造");
    }

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

    public void sayHello() {
        System.out.println("我是父类成员方法");
    }

    static {
        System.out.println("父类静态代码块1");
    }
    static {
        System.out.println("父类静态代码块2");
    }
    {
        System.out.println("父类构造代码快");
    }
}
执行结果如下
父类静态代码块1
父类静态代码块2
子类静态代码块1
子类静态代码块2
-------------分隔线:执行无参对象创建及方法(第一次)-------------------
父类构造代码快
父类不带参数构造
子类构造代码快
子类不带参数构造
我是子类成员方法
-------------分隔线:执行无参对象创建及方法(第二次)-------------------
父类构造代码快
父类不带参数构造
子类构造代码快
子类不带参数构造
我是子类成员方法
-------------分隔线:执行带参对象创建及方法-------------------
父类构造代码快
父类带参数构造
子类构造代码快
子类带参数构造
我是子类成员方法
-------------分隔线:执行静态方法-------------------
我是子类静态方法

有这么几点说明

(下面所说的,对象的创建,是new出来的对象)

  • 静态代码块
    • 不管对象创建几次(或者说不管创不创建对象),只执行一次,且优先级最高(因为在对象创建之前就已加载完毕)
    • 多个静态代码块按代码顺序来执行
  • 构造代码块
    • 创建几次对象就执行几次,优先级在静态代码块之后,在构造方法之前执行
  • 构造方法
    • 创建几次就执行几次,在静态方法之前执行
  • 静态方法
    • 在构造方法之后执行(因为类得先加载出来,才能执行此类的静态方法。然而在加载该类时,构造代码块和构造方法就执行了)
整个过程都是父比子先执行,且构造代码块和构造方法是整体的父先子后的顺序

你可能感兴趣的:(java)