
5.7 代码块
代码块是在程序之中使用“{}”定义起来的一段程序,而根据代码块声明位置以及声明关键字的不同,代码块一共分为4种:普通代码块、构造代码块、静态代码块和同步代码块(同步代码块将在“第14章多线程编程”部分进行讲解)。
5.7.1 普通代码块

普通代码块是定义在方法中的代码块,利用这类代码块可以解决代码块在一个方法中过长导致出现重复变量定义的问题,在讲解此操作之前,首先来观察以下代码。
范例:观察一个程序


本程序在if语句中定义了一个局部变量x,由于“{}”的作用,所以该变量不会与外部的变量x产生影响。
提问:什么叫全局变量?什么叫局部变量?
在范例中给出的全局变量和局部变量的概念是固定的吗?还是有什么其他的注意事项?
回答:全局变量和局部变量是一种相对性的概念。
全局变量和局部变量是针对定义代码的情况而定的,只是一种相对性的概念,例如,在以上的范例中,由于第一个变量x定义在了if语句之中(即定义在了一个“{}”中),所以相对于第二个变量x其就成为局部变量,而如果说现在有以下的程序代码。
范例:说明代码

此程序中,相对于主方法中定义的变量x而言,在类中定义的变量x就成为全局变量。所以这两个概念是相对而言的。
对于以上的范例,如果将if语句取消了,实际上就变为了普通代码块,这样就可以保证两个x变量不会相互影响。
范例:定义普通代码块

在本程序中直接使用一个“{}”定义了一个普通代码块,同样还将一个变量x定义在“{}”中,不会与全局的x变量相互影响,使用普通代码块可以将一个方法中的代码进行部分分割。
5.7.2 构造代码块

将代码块定义在一个类中,这样就成为构造代码块。构造代码块的主要特点是在使用关键字new实例化新对象时进行调用。
范例:定义构造代码块

通过程序的执行结果可以发现,每一次实例化新的对象时都会调用构造块,并且构造代码块的执行优先于构造方法的执行。
5.7.3 静态代码块

静态代码块也是定义在类中的,如果一个构造代码块上使用了static关键字进行定义的话,那么就表示静态代码块,静态代码块要考虑两种情况。
情况1:在非主类中定义的静态代码块。
情况2:在主类中定义的静态代码块。
范例:在非主类中定义的静态代码块


在本程序中实例化了多个Person类对象,可以发现静态代码块优先于构造代码块执行,并且不管实例化多少个对象,静态代码块中的代码只执行一次。
提示:利用静态代码块可以实现一些公共的初始化操作。
在实际项目的开发中,由于静态代码块优先于所有程序代码执行,所以可以利用静态代码块进行一些初始化代码的执行,如下所示。
范例:利用静态代码块执行初始化代码

在本程序中利用静态代码块执行了部分程序代码,这些代码可以在类第一次使用的时候进行初始化操作,也是在实际开发中使用较多的一种代码结构。
范例:在主类中定义的静态代码块


通过程序的执行结果可以发现,主类中定义的静态代码块会优先于主方法执行。
注意:JDK 1.7之后的改变。
在JDK 1.7之前,实际上Java一直存在一个bug。按照标准来讲,所有的程序应该由主方法开始执行,可是通过以上范例可以发现,静态代码块会优先于主方法执行。所以在JDK 1.7之前,是可以使用静态代码块来代替主方法的,即以下的程序是可以执行的。
范例:JDK 1.7之前的bug

但是本程序在JDK 1.7之后却无法执行了,这是由于版本升级所解决的问题,而这一bug从1995年开始一直到2012年都存在。