![名师讲坛: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=1739283077-AcwRY5D09yvDSHHVWioX2KQR8AB2CkPI-0-21f8d65e5909cb6b498c02ed3450d830)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P140_124206.jpg?sign=1739283077-yadW6MDj5OJcP93KPo7QF3aAGVVm1Zp2-0-c3040c18690ba67ce119fda2406a4376)
本程序利用了普通代码块对一个方法中的结构进行了分割,这样即使定义有重名变量x,但是由于其处于不同的范围,也不会互相影响。所以普通代码块的主要作用是进行程序分割使用。
5.11.2 构造块
构造代码块是直接写在类中的代码块。
【例5.60】定义构造块
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P141_124207.jpg?sign=1739283077-3atHKAmVnio6GQ4j458AbxQrZTlLJ0qO-0-b3359fd6c172aeb53ae572a97de84d3c)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P141_124208.jpg?sign=1739283077-RPTxvRJlXqcGhmMM1kilVUUUauZDojBE-0-7f22106864cf71f54c4aad75985adea1)
本程序在主方法中产生了3个实例化对象,从输出的结果可以发现,构造块优先于构造方法执行,而且每次实例化对象的时候都会执行构造块中的代码,会执行多次。
5.11.3 静态代码块
静态代码块,是使用static关键字声明的代码块。
【例5.61】静态代码块
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P141_124209.jpg?sign=1739283077-xGsEB0WcNzaC5iGIV5OXqbHjkgwmgTyj-0-6c373ff54f4fbe7b011cf379176fdcf6)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P142_124211.jpg?sign=1739283077-PbXrC6wfAcgrlYER8D8rrjiNIDor36BT-0-143e77ce6aeb5a5a66356b153ec256e4)
从程序运行结果可以发现,静态代码块优先于主方法执行,而在类中定义的静态代码块会优先于构造块执行,而且不管有多少个对象产生,静态代码块只执行一次。
提示
关于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=1739283077-m3Zqo7WPQ0NyWnKtsdgr09BQHYGYELQW-0-13202d336db68baf50a01af5caa438d2)
程度执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P142_124217.jpg?sign=1739283077-hDRnzflnhxcDS00SbWJHGiVnFSFPrivi-0-c20e46db75d16b6fed20db14642c83f7)
在JDK 1.7之后如果使用了以上操作形式,那么依然会提示用户找不到主方法的错误。