![名师讲坛:Java开发实战经典(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/824/26793824/b_26793824.jpg)
上QQ阅读APP看书,第一时间看更新
5.11 代码块
代码块本身并不是一个很难理解的概念,实际上之前也一直在使用。所谓的代码块是指使用“{}”括起来的一段代码,根据位置不同,代码块可以分为4种:普通代码块、构造块、静态代码块、同步代码块,其中同步代码块本书将在多线程部分进行讲解,本章先来观察其他3种代码块。
5.11.1 普通代码块
普通代码块就是指直接在方法或是语句中定义的代码块,如下面代码。
【例5.59】在方法中定义普通代码块
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P140_124205.jpg?sign=1739232338-Pf12UFhd3OrXpUH0ngnmCrfImsbQJpwQ-0-b776ede48109e723ed056ca0b4c34d7c)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P140_124206.jpg?sign=1739232338-YcRSVvaUDaw5r4AFJQxUbCJZdUIMOTy0-0-1b2a1cdb23bd80a1454719f61e23f4d5)
本程序利用了普通代码块对一个方法中的结构进行了分割,这样即使定义有重名变量x,但是由于其处于不同的范围,也不会互相影响。所以普通代码块的主要作用是进行程序分割使用。
5.11.2 构造块
构造代码块是直接写在类中的代码块。
【例5.60】定义构造块
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P141_124207.jpg?sign=1739232338-hAZlxismjM5VXFCqrMGjqXvQW4Glp61Z-0-5d0a237534750c5efc351f9360d54718)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P141_124208.jpg?sign=1739232338-ehi1MmWzv8sy7ZsXillabv8j1sISY0ly-0-8606b0593a72381acd5c513eba73c727)
本程序在主方法中产生了3个实例化对象,从输出的结果可以发现,构造块优先于构造方法执行,而且每次实例化对象的时候都会执行构造块中的代码,会执行多次。
5.11.3 静态代码块
静态代码块,是使用static关键字声明的代码块。
【例5.61】静态代码块
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P141_124209.jpg?sign=1739232338-kU9FwESFDhIWwR7uC6zFtoSRB1aPwNbN-0-2aefdaba2a95d8ebd8f032c5f4ae1bb5)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P142_124211.jpg?sign=1739232338-dv6iTMwvrAuXfCAC98DlRSgsbaCGh0bL-0-f248aa9bfd2b9b92b1d58c9bd312b9e5)
从程序运行结果可以发现,静态代码块优先于主方法执行,而在类中定义的静态代码块会优先于构造块执行,而且不管有多少个对象产生,静态代码块只执行一次。
提示
关于JDK存在bug的解决。
在JDK 1.7版本之前,Java一直存在有一个bug:可以利用静态块实现主方法的操作。这一点与Java设计的初衷有矛盾,因为Java要求必须通过主方法开始执行程序。所以以下代码从JDK 1.7之后就不能够执行了,而在这之前的版本可以正常使用。
实例:原始的bug
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P142_124215.jpg?sign=1739232338-H9XGz0O5ETYA9f6yTt4YiImTsPdO33cZ-0-0c46e895c50c2af66ac0bf9f436485df)
程度执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P142_124217.jpg?sign=1739232338-F5LNNuEi5J3gQDnUJtlrotgtDB9UNSue-0-a29acb05b7659dd7328c2ade1bb37830)
在JDK 1.7之后如果使用了以上操作形式,那么依然会提示用户找不到主方法的错误。