优先级问题

200 阅读1分钟

构造函数、静态代码块和普通代码块的执行顺序

类加载的时候执行【静态代码块】 new对象的时候先执行【普通代码块】再执行【构造代码块】 每次new对象都会执行普通代码块。测试如下:


class Code{
    public Code() {
        System.out.println("构造方法--------Code");
    }
    {
        System.out.println("构造块--------Code");
    }
    static {
        System.out.println("静态代码块--------Code");
    }
}

public class CodeBlock {
    {
        System.out.println("构造块--------CodeBlock");
    }
    static {
        System.out.println("静态代码块--------CodeBlock");
    }

    public CodeBlock() {
        System.out.println("构造方法--------CodeBlock");
    }

    public static void main(String[] args) {
        System.out.println("main开始执行---------------------------");
        new Code();
        new Code();
        new CodeBlock();
    }
}

    运行结果:
    
/*
        静态代码块--------CodeBlock
        main开始执行---------------------------
        静态代码块--------Code
        构造块--------Code
        构造方法--------Code
        构造块--------Code
        构造方法--------Code
        构造块--------CodeBlock
        构造方法--------CodeBlock

       
        */

有继承关系的构造函数、静态代码块和普通代码块的执行顺序

类加载的时候先调用父类静态代码块,子类在创建对象的时候会先调用父类的普通构造代码块和构造函数(并不会创建父类对象)。

class Father{
    public Father() {
        System.out.println("构造方法--------------father");
    }
    {
        System.out.println("普通代码块--------------father");
    }
    static {
        System.out.println("静态代码块--------------father");
    }
}

class Son extends Father{
    public Son() {
        System.out.println("构造方法--------------son");
    }
    {
        System.out.println("普通代码块--------------son");
    }
    static {
        System.out.println("静态代码块--------------son");
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("main函数开始");
        new Son();
    }
}

运行结果:

main函数开始
静态代码块--------------father
静态代码块--------------son
普通代码块--------------father
构造方法--------------father
普通代码块--------------son
构造方法--------------son