优先级PK:Java中的4种代码块,谁先谁后?

问题:Java里的四种代码块,像积木一般搭成代码塔。那么一段复杂的代码在JVM里每一句的执行顺序是如何的呢?

思路:看代码块的优先级顺序——>被调用的顺序

答:要回答这个问题,我们先来看看四种代码块是哪些:
1-1 Java代码块定义

有了定义,还是要具体例子的:

public class HelloWrold {
    public static void main(String[] args) {
        new Person().function1();
        new Person().function1();
        System.out.println("6.=================");
        Person.function2();
        Person.function2();
    }
}
class Person {
    static{
        System.out.println("1.我是静态块,优先于构造块执行!并且只有创建第一个对象的时候执行一次!");
    }
    {
        System.out.println("2.我是构造块,优先于构造方法执行!每创建一个对象执行一次!");
    }
    public Person() {
        System.out.println("3.我是构造方法,每创建一个对象执行一次");
    }
    public void function1(){
        System.out.println("4. 我是非静态方法中的普通代码块,方法被调用时执行!");
    }
    public static void function2(){
        System.out.println("5. 我是静态方法中的普通代码块,方法被调用时执行,晚于静态块执行!");
    }
}

想一下,上述代码在执行的时候,输出会是如何的顺序?

答案是:1234,234,6,55

解刨一下这段短短的代码:
new Person().function1();

翻译人话:通过构造器person(),建立Person对象,调用对象方法function1();
执行顺序:构造器静态块1–>构造方法块2–>构造器块3–>对象普通方法块4;

new Person().function1();
翻译人话:重复建立Person对象,此时静态构造器块pass,其余再来一遍;
执行顺序:构造方法块2–>构造器块3–>对象普通方法块4;

System.out.println("=…=");
Person.function2();
Person.function2();
翻译人话:打印“=…=”;对象Person调用function2()两次;
执行顺序:3句话都是普通块,不存在优先级插队,顺序执行:
println普通块6–>对象方法块5–>对象方法块5

所以,答案是 1234234655

Reference:
krisll 2017. 详解java中的四种代码块
https://www.jb51.net/article/129990.htm

猜你喜欢

转载自blog.csdn.net/OliverZang/article/details/83504143