1. 程式人生 > >[javase學習筆記]-8.8 構造代碼塊

[javase學習筆記]-8.8 構造代碼塊

peak 學習筆記 .net 有一個 全部 mod log view body

這一節我們再看一個特殊的代碼塊。那就是構造代碼塊。


這裏我們簡單的通過樣例來說明一下:

class Person
{
	private String name;
	{
		System.out.println("Person類的第一個代碼塊被運行");
	}

	Person()
	{
		System.out.println("無參數構造函數被運行");
		this.name = "小寶寶";
	}
	Person(String name)
	{
		System.out.println("有name參數構造函數被運行");
		this.name = name;
	}
	public void speak()
	{
		System.out.println("名字:"+name);
	}
}

class ConBlockTest
{
	public static void main(String[] args) 
	{
		Person p1 = new Person();
		p1.speak();
		Person p2 = new Person("小科比");
		p2.speak();
	}
}
我們在這個樣例中看到了Person類中有一個代碼塊,它沒有被statickeyword修飾,這就是我們這一節所說的構造代碼塊,為什麽這麽說呢,我們看運行結果:

技術分享圖片

我們非常顯然就看到了在我們創建兩個對象時,該代碼塊都被運行了。而構造函數僅僅是當創建相應對象時被調用。

所以構造代碼塊的作用就是:給全部對象進行同樣部分的初始化。

而我們的構造方法是對相應的對象進行有針對性的獨特的初始化。


那麽構造代碼塊的構造函數哪個先運行呢?我們看代碼:

class Person
{
	private String name;

	{//第一個構造代碼塊
		System.out.println("Person類的第1個代碼塊被運行");
	}

	Person()
	{
		System.out.println("無參數構造函數被運行");
		this.name = "小寶寶";
	}
	Person(String name)
	{
		System.out.println("有name參數構造函數被運行");
		this.name = name;
	}
	public void speak()
	{
		System.out.println("名字:"+name);
	}

	{//第二個構造代碼塊
		System.out.println("Person類的第2個代碼塊被運行");
	}
}
我們看結果:

技術分享圖片

我們看到兩個不同位置的構造代碼塊都在構造函數被運行之前就已經運行了。所以說構造代碼塊優先於構造函數運行。


所以,當我們須要把全部對象都有同樣的初始化時,我們能夠使用構造代碼塊來實現。比方上面的樣例中,人一出生都會哭,那麽我們就能夠用構造代碼塊來初始哭這個功能:

class Person
{
	private String name;

	{
		cry();
	}

	Person()
	{
		this.name = "小寶寶";
	}
	Person(String name)
	{
		this.name = name;
	}
	public void cry()
	{
		System.out.println("哇哇");
	}
	public void speak()
	{
		System.out.println("名字:"+name);
	}
}
這樣我們就把全部對象哭的功能封裝到了一個構造代碼塊中。在創新對象是會優先運行,非常好的實現了我們想要的功能。

技術分享圖片

[javase學習筆記]-8.8 構造代碼塊