最近去线下面试,以为直接和面试官去谈,结果拿出一张试卷,我一脸蒙蔽,不及格就没有办法和面试官去谈,结果、结果、结果..........后来你懂的,不然我也不会写下这篇文章。

首先来个总结,最后再来个总结首位呼应

 

最开始

如果没有父类对象:静态代码块

如果有继承父类:父类静态代码块-》子类静态代码块

new 对象();

首先如果是单类对象:代码块的执行顺序:普通块-》构造块

如果继承父类:父类普通块-》父类构造块-》子类普通块-》子类构造块

执行顺序:父类-》子类

总的流程:父静态块-》子静态块-》main方法-》父普通块-》父构造方法-》子普通块-》子构造方法

 

然后我们看看示例代码

1、代码演示目的说明:静态块->main方法->普通块->构造块

public class A {
    //静态块>普通块>构造块
    public A(){
        System.out.println("A constructor ......");
    }
    static{
        System.out.println("A static......");
    }
    {
        System.out.println("A common......");
    }

    public static void main(String[] args) {
        System.out.println("start......");
        new A();
        System.out.println("end......");
    }
}

 代码结果:

A static......
start......
A common......
A constructor ......
end......

 

2、代码演示结果目的说明:每次new对象的时候都会先执行普通块,然后执行构造块

public class A {
    //静态块->普通块->构造块
    public A(){
        System.out.println("A constructor ......");
    }
    static{
        System.out.println("A static......");
    }
    {
        System.out.println("A common......");
    }

    public static void main(String[] args) {
        System.out.println("start......");
//每次new对象都会先执行普通块,然后执行构造块
        new A();
        new A();
        System.out.println("end......");
    }
}

代码结果:

A static......
start......
A common......
A constructor ......
A common......
A constructor ......
end......

 

3、代码演示目的说明:多个同等级代码块的执行顺序取决于在代码中的顺序位置,从上到下

public class A {
    //静态块->普通块->构造块
    public A(){
        System.out.println("A constructor ......");
    }
    static{
        System.out.println("A static......");
    }
    static{
        System.out.println("A also static......");
    }
    {
        System.out.println("A also common......");
    }
    {
        System.out.println("A common......");
    }

    public static void main(String[] args) {
        System.out.println("start......");
        new A();
        new A();
        System.out.println("end......");
    }
}

 代码结果:

A static......
A also static......
start......
A also common......
A common......
A constructor ......
A also common......
A common......
A constructor ......
end......

 

4、代码演示结果目的说明:继承有父类的对象的执行顺序:父类->子类

public class B extends A{
    public B(){
        System.out.println("B constructor ......");
    }
    static{
        System.out.println("B static ......");
    }
    {
        System.out.println("B common ......");
    }

    public static void main(String[] args) {
        System.out.println("start");
        new B();
        System.out.println("end");
    }
}

 代码结果:

A static......
A also static......
B static ......
start
A also common......
A common......
A constructor ......
B common ......
B constructor ......
end

 

总结:静态块-》普通块-》构造块,父类-》子类,多个静态块会在程序初始化的时候去执行,多个普通块会在new对象的时候按照在代码中从上到下的顺序依次执行。

最开始

如果没有父类对象:静态代码块

如果有继承父类:父类静态代码块-》子类静态代码块

new 对象();

首先如果是单类对象:代码块的执行顺序:普通块-》构造块

如果继承父类:父类普通块-》父类构造块-》子类普通块-》子类构造块

执行顺序:父类-》子类

总的流程:父静态块-》子静态块-》main方法-》父普通块-》父构造方法-》子普通块-》子构造方法