打字猴:1.700441266e+09
1700441266
1700441267 }
1700441268
1700441269 public Client(String_str){
1700441270
1700441271 System.out.println(“执行有参构造”);
1700441272
1700441273 }
1700441274
1700441275 }
1700441276
1700441277 这是一段非常简单的代码,它包含了构造代码块、无参构造、有参构造,我们知道代码块不具有独立执行的能力,那么编译器是如何处理构造代码块呢?很简单,编译器会把构造代码块插入到每个构造函数的最前端,上面的代码与如下代码等价:
1700441278
1700441279 public class Client{
1700441280
1700441281 public Client(){
1700441282
1700441283 System.out.println(“执行构造代码块”);
1700441284
1700441285 System.out.println(“执行无参构造”);
1700441286
1700441287 }
1700441288
1700441289 public Client(String_str){
1700441290
1700441291 System.out.println(“执行构造代码块”);
1700441292
1700441293 System.out.println(“执行有参构造”);
1700441294
1700441295 }
1700441296
1700441297 }
1700441298
1700441299 每个构造函数的最前端都被插入了构造代码块,很显然,在通过new关键字生成一个实例时会先执行构造代码块,然后再执行其他代码,也就是说:构造代码块会在每个构造函数内首先执行(需要注意的是:构造代码块不是在构造函数之前运行的,它依托于构造函数的执行),明白了这一点,我们就可以把构造代码块应用到如下场景中:
1700441300
1700441301 (1)初始化实例变量(Instance Variable)
1700441302
1700441303 如果每个构造函数都要初始化变量,可以通过构造代码块来实现。当然也可以通过定义一个方法,然后在每个构造函数中调用该方法来实现,没错,可以解决,但是要在每个构造函数中都调用该方法,而这就是其缺点,若采用构造代码块的方式则不用定义和调用,会直接由编译器写入到每个构造函数中,这才是解决此类问题的绝佳方式。
1700441304
1700441305 (2)初始化实例环境
1700441306
1700441307 一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景,例如在JEE开发中,要产生HTTP Request必须首先建立HTTP Session,在创建HTTP Request时就可以通过构造代码块来检查HTTP Session是否已经存在,不存在则创建之。
1700441308
1700441309 以上两个场景利用了构造代码块的两个特性:在每个构造函数中都运行和在构造函数中它会首先运行。很好地利用构造代码块的这两个特性不仅可以减少代码量,还可以让程序更容易阅读,特别是当所有的构造函数都要实现逻辑,而且这部分逻辑又很复杂时,这时就可以通过编写多个构造代码块来实现。每个代码块完成不同的业务逻辑(当然了,构造函数尽量简单,这是基本原则),按照业务顺序依次存放,这样在创建实例对象时JVM也就会按照顺序依次执行,实现复杂对象的模块化创建。
1700441310
1700441311
1700441312
1700441313
1700441314 编写高质量代码:改善Java程序的151个建议 [:1700438106]
1700441315 编写高质量代码:改善Java程序的151个建议 建议37:构造代码块会想你所想
[ 上一页 ]  [ :1.700441266e+09 ]  [ 下一页 ]