建议36(3):使用构造代码特别之处

下面来看看构造代码块的奇妙之处:想你所想。
如下例子:
public class EveryDay
{
	public static void main(String[] args)
	{
		new ConstructorTest();
		new ConstructorTest(0);
		new ConstructorTest("hello");
		System.out.println("ConstructorTest 实例对象的个数  = "+ConstructorTest.objectNum);
	}
}

class ConstructorTest
{
	static int objectNum=0;
	//构造代码块
	{
		objectNum++;
		System.out.println("构造代码块");
	};
	
	public ConstructorTest()
	{

		System.out.println("无参构造函数");	
	}
	
	public ConstructorTest(String s)
	{	
		this();	
		System.out.println("有参构造函数调用无参构造函数");	

	}	
	public ConstructorTest(int s)
	{
		System.out.println("带参构造函数");	
	}	
}

在main函数里面我们只创建了三个ConstructorTest对象,从构造函数两个特征(在执行每个构造函数时都会执行构造代码块和在执行构造函数前执行代码块)来看,输出的实例对象的个数objectNum好像为4个,而在类外部看来只创建了三个对象。两者看起来矛盾了?
看看打印结果:
构造代码块
无参构造函数
构造代码块
带参构造函数
构造代码块
无参构造函数
有参构造函数调用无参构造函数
ConstructorTest 实例对象的个数  = 3

特殊在执行:
new ConstructorTest("hello");
即:有参构造函数调用无参构造函数时,
public ConstructorTest(String s)
	{	
		this();	
		System.out.println("有参构造函数调用无参构造函数");	
	}
只执行了一次构造代码块,而实际上我们也只需要执行一次构造代码块来进行初始化工作就ok了。构造代码块就是为了提前构造函数中的共同量,做每个构造函数都需要做的事,来减少代码量。于是java很聪明的代码块插入到没有this的构造函数中,确保创建一个对象时之执行一次构造代码块。
看,java已经想你所想,放心使用构造代码块吧,如是秦哥说道。

你可能感兴趣的:(建议36(3):使用构造代码特别之处)