Java基础——构造代码块

看一段代码先

<!-- lang: java -->
public class Test {
//
public Test() {
	init();
	System.out.println("无参构造方法");
}

public Test(int i) {
	init();
	System.out.println("整数参数构造方法" + i);
}

public Test(String str) {
	init();
	System.out.println("字符串参数构造方法" + str);
}

public void init_Test() {
	// 做一些变量的初始化或者对象所需要的环境创建工作
}
}

采用构造代码块的实现

<!-- lang: java -->
public class Test {

{
	// 做一些变量的初始化或者对象所需要的环境创建工作
}

public Test() {
	System.out.println("无参构造方法");
}

public Test(int i) {
	System.out.println("整数参数构造方法" + i);
}

public Test(String str) {
	System.out.println("字符串参数构造方法" + str);
}
}

第二段的代码无非是把共同的逻辑,init_Test()放到了{}之中,这种实现就叫做构造代码块。

理解一下定义

代码块:用大括号把多行代码封装在一起,形成一个独立的数据体,实现特定算法的集合,这样一个就是代码块,说白了就是大括号括起来的这样一个结构。 Java中包含4种代码块: 1:普通代码块,方法体之后的这种结构,太常见了,不多说。 2:静态代码块,有人称之为静态块,static 后跟着{ }这样一种结构,常用于静态变量的初始化或对象创建之前的环境初始化。 3:同步代码块:synchronized关键字修饰的,它表示同一时间只能有一个线程进入其中,是一种多线程保护机制。 4:构造代码块:在类中,没有任何前缀或后缀,直接用{},这样一种结构就是构造代码块。

构造代码块的几个问题

众所周知,每一个类都有一个构造函数,而且至少有一个,如果没有特意声明,那么编译器会自动创建一个无参构造函数,然后再生成对象的时候调用这个构造函数。那么我们需要解决如下几个问题: 1:构造函数和构造代码块是什么关系? 2:构造代码块何时执行? 3:构造代码块的原理是什么? 4:构造代码块的目的或者说应用场景又是什么?

解释:

编译器在看到构造代码块的时候,会把构造代码块插入到每个构造器的最前端。每次new 一个实例的时候会首先执行构造代码块,而后执行构造函数内部的逻辑,说白了,构造代码块就是构造函数内部首先执行的逻辑块。

应用场景

1:如果每个构造方法都有一个共同的逻辑:初始化变量,我们可能想到把共同的逻辑提取到一个方法中,然后在每一个构造方法中调用就可以,但是还有更好的形式:构造代码块,利用了构造代码块,我们不需要调用,不需定义新的方法,编译器替我们实现我们想要达到的目的,而且代码看起来更加的优雅

2:有时候,我们创建的对象需要依靠某种环境才能够存在,如果该环境不存在,则手动创建一个。

以上两个点其实是一样的,无非就是在构造器之中具有共同需要执行的逻辑,而且这个业务逻辑的优先级别是第一等的,当遇到构造函数具有共同逻辑的时候,采取构造代码块会让程序更加的优雅,当然,构造函数还是应该尽量的简单。 根据功能的不同,可以编写多个构造代码块,当然构造代码块的顺序,必须是业务逻辑的顺序才行。

特殊情况

凡事皆有特例,生活之中如此,技术上也不例外。

当一个构造方法采取this的方式来调用其它构造方法的时候,这时,不会插入构造代码块,也就是说,在这两个构造函数执行期间,Java编译器会发现内部的这个构造方法(this代表的那个构造方法)已经调用过一次构造代码块了,这时,外部的这个就不会再调用第二次构造代码块了。

我们要回到创建构造代码块的根本目的来说:构造代码块无非就是把个构造函数共同的逻辑提取出来,提前执行而已。既然是共同逻辑,那么只要执行一次即可。

除了this,还有super

总之

我们只要记住,构造代码块是构造函数的共同逻辑,会在构造函数内部逻辑之前执行,而且只会执行一次,这样就足够了。

转载于:https://my.oschina.net/sudojs/blog/227277

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值