
上QQ阅读APP看书,第一时间看更新
5.11 代码块
代码块本身并不是一个很难理解的概念,实际上之前也一直在使用。所谓的代码块是指使用“{}”括起来的一段代码,根据位置不同,代码块可以分为4种:普通代码块、构造块、静态代码块、同步代码块,其中同步代码块本书将在多线程部分进行讲解,本章先来观察其他3种代码块。
5.11.1 普通代码块
普通代码块就是指直接在方法或是语句中定义的代码块,如下面代码。
【例5.59】在方法中定义普通代码块

程序执行结果:

本程序利用了普通代码块对一个方法中的结构进行了分割,这样即使定义有重名变量x,但是由于其处于不同的范围,也不会互相影响。所以普通代码块的主要作用是进行程序分割使用。
5.11.2 构造块
构造代码块是直接写在类中的代码块。
【例5.60】定义构造块

程序执行结果:

本程序在主方法中产生了3个实例化对象,从输出的结果可以发现,构造块优先于构造方法执行,而且每次实例化对象的时候都会执行构造块中的代码,会执行多次。
5.11.3 静态代码块
静态代码块,是使用static关键字声明的代码块。
【例5.61】静态代码块

程序执行结果:

从程序运行结果可以发现,静态代码块优先于主方法执行,而在类中定义的静态代码块会优先于构造块执行,而且不管有多少个对象产生,静态代码块只执行一次。
提示
关于JDK存在bug的解决。
在JDK 1.7版本之前,Java一直存在有一个bug:可以利用静态块实现主方法的操作。这一点与Java设计的初衷有矛盾,因为Java要求必须通过主方法开始执行程序。所以以下代码从JDK 1.7之后就不能够执行了,而在这之前的版本可以正常使用。
实例:原始的bug

程度执行结果:

在JDK 1.7之后如果使用了以上操作形式,那么依然会提示用户找不到主方法的错误。