這一節我們再看一個特殊的代碼塊,那就是構造代碼塊。
這里我們簡單的通過例子來說明一下:
~~~
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類中有一個代碼塊,它沒有被static關鍵字修飾,這就是我們這一節所說的構造代碼塊,為什么這么說呢,我們看運行結果:

我們很顯然就看到了在我們創建兩個對象時,該代碼塊都被執行了,而構造函數只是當創建對應對象時被調用。
所以構造代碼塊的作用就是:**給所有對象進行相同部分的初始化。**
而我們的構造方法是對對應的對象進行有針對性的獨特的初始化。
那么構造代碼塊的構造函數哪個先執行呢?我們看代碼:
~~~
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);
}
}
~~~
這樣我們就把所有對象哭的功能封裝到了一個構造代碼塊中,在創新對象是會優先執行,很好的實現了我們想要的功能。

- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現