一、需要了解的知识点
- 局部代码块:直接定义在方法内部的代码块,常与if,while等关键字联合使用。
- 初始化代码块(构造代码块):直接定义在类中的代码块,每次创建对象时被调用,实质上是作为构造器的前几行语句来执行的(详细原因(链接目录的第三章第4条))。
- 静态代码块:定义在类中且使用static修饰的代码块。
二、用代码进行测试
- 测试代码如下:
public class Test { //初始化代码块 { System.out.println("初始化代码块"); } //静态代码块 static{ System.out.println("静态代码块"); } //构造器 public Test(){ System.out.println("静态构造器代码块"); } public static void main(String[] args) { System.out.println("main方法代码块"); Test test = new Test(); } }
- 运行结果如下:
三、对测试结果分析
1、 由上图可以看到代码块的执行流程,先执行静态代码块,再执行main方法的代码块,且在创建对象时先执行初始化代码块,后执行构造器中的代码。
2、 结果如上图所示,但是我们应该产生疑问,我们知道main方法是程序的入口方法,但是为什么静态代码快先于main方法中的语句输出呢?
- 原因是,静态成员随着字节码的加载也被加载进JVM,此时main方法还没有被JVM调用被执行,也就是说,字节码被加载进JVM后,此时静态成员已经存在于内存中了(若你不了解Java中成员的内存分布,请点击此处了解,这篇文章是写的类的变量的内存分布,类的成员也适用),而后JVM才调用的main方法。