问题:Java里的四种代码块,像积木一般搭成代码塔。那么一段复杂的代码在JVM里每一句的执行顺序是如何的呢?
思路:看代码块的优先级顺序——>被调用的顺序
答:要回答这个问题,我们先来看看四种代码块是哪些:
有了定义,还是要具体例子的:
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