Java 静态代码块,构造代码块和构造方法执行顺序的理解

静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次

Java 静态代码块,构造代码块和构造方法执行顺序的理解_第1张图片

输出结果为:

Java 静态代码块,构造代码块和构造方法执行顺序的理解_第2张图片

可以看到静态代码块只执行了一次

 

接下来看探讨静态代码块,构造代码块和构造方法间的执行顺序

Java 静态代码块,构造代码块和构造方法执行顺序的理解_第3张图片

输出结果为:

Java 静态代码块,构造代码块和构造方法执行顺序的理解_第4张图片

看到main方法中的第一行语句并不是最先被执行,同时也看到static块只会执行一次

static块(静态代码块)可以置于类中的任何地方,类中可以有多个static块。它的执行优先级是最高的,与main入口函数无关,main方法是一个特殊的静态方法,但是还是静态方法,此时JVM会加载main方法所在的类,试图找到类中其它静态方法

 

涉及到类的继承又会怎么样呢?

Java 静态代码块,构造代码块和构造方法执行顺序的理解_第5张图片

demo2继承了demo

红线处创建demo2实例

输出结果为:

Java 静态代码块,构造代码块和构造方法执行顺序的理解_第6张图片

从结果看到,有创建类实例的时候,就会先去找该类的静态方法块,然后回来执行main方法->找子类是否有静态方法块(类初次被加载的时候执行且仅会被执行一次)->进入子类构造方法(Java类的继承,父类的构造方法没有被显式调用,编译器会自动地将super()作为构造方法的第一条语句)-> 进入父类的构造方法 -> 返回子类的构造方法

如果还有构造代码块的话,通过反编译可以看到,构造代码块会被放入构造方法里的第一条语句,所以上图的结果都是构造代码块的输出语句先于构造方法块的输出

最后聊聊static块(这里摘自https://blog.csdn.net/javashareauthor/article/details/90902599)

类被加载了不一定就会执行静态代码块,只有一个类被主动使用的时候,静态代码才会被执行。

当一个类被主动使用时,Java虚拟就会对其初始化,如下六种情况为主动使用:

1、当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)

2、当调用某个类的静态方法时

3、当使用某个类或接口的静态字段时

4、当调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时

5、当初始化某个子类时

6、当虚拟机启动某个被标明为启动类的类(即包含main方法的那个类)
 

 

你可能感兴趣的:(后台开发,java)