今天回想這幾天走過的Java路程,發現漏了一個點,就是構造代碼塊,我絞盡腦汁,也沒想起來它的做用,我騙不了我本身,就搜相關資料,從新學習,在學習的過程當中發現構造代碼塊和構造函數有必定的聯繫,爲了捕捉這種聯繫,我總結了一個案例,這個案例能加深你對構造函數和構造代碼塊的理解。我寫這個博客一是爲了不下次再被構造代碼塊這塊石頭絆倒,二是爲了能給須要解惑的人提供一些幫助,仍是那句話:前端
越懂得與人分享,你的價值增值越大!java
看代碼前要先明白一個需求:jvm
使用Java類描述一個嬰兒,假設如今兩種嬰兒,一種嬰兒是一出生就有了名字,咱們把這種嬰兒叫白戶,另外一種嬰兒是出生後纔有了名字,咱們把這種嬰兒叫黑戶。(爲了方便理解,我把剛出生就已經有名字的叫白戶,把出生後才起名的叫黑戶)函數
//嬰兒類
public class Baby { int id;//身份證 String name;//名字 //哭 public void cry(){ System.out.println(name+"哇哇的哭。。。。"); } } class Test{ public static void main(String[] args) { //建立一個baby對象 Baby baby = new Baby();//嬰兒出生 baby.id=111; baby.name="小娃娃";//黑戶 baby.cry(); } }
運行結果: 小娃娃哇哇的哭。。。。
因爲小娃娃是出生以後才賦的值,因此小娃娃是黑戶,咱們如今要讓嬰兒一出生就有名字,就要用構造函數。學習
構造函數的做用: 給對應的對象進行初始化this
構造函數定義的格式:spa
修飾符 函數名(形式參數){ 函數體。。。 }
構造函數要注意的細節:對象
1.構造函數沒有返回值類型blog
2.構造函數的函數名必需要與類名一致生命週期
3.構造函數並非由咱們手動調用的,而是在建立對應的對象時,jvm就會主動調用到對應的構造函數
4.若是一個類沒有顯式的寫上一個構造方法時,Java編譯器會爲該類添加一個無參的構造方法
5.若是一個類已經顯示的寫上一個構造方法時,Java編譯器不會再爲該類添加無參的構造方法
6.構造函數是能夠在一個類中以函數重載的形式存在多個的
//嬰兒類
public class Baby {
int id;//身份證
String name;//名字
//無參構造函數
public Baby(){
}
//有參構造函數
public Baby(int id, String name) {
this.id = id;
this.name = name;
System.out.println("Baby的屬性初始化完畢!!!");
}
//哭
public void cry(){
System.out.println(this.name+"哇哇的哭。。。。");
}
}
class Test{
public static void main(String[] args) {
//建立一個baby對象
Baby baby = new Baby(222,"小可愛");//嬰兒出生 白戶
baby.cry();
}
}
運行結果: Baby的屬性初始化完畢!!! 小可愛哇哇的哭。。。。
經過上面的黑戶和白戶,咱們能對構造函數有個深入的理解,下面我再引伸出構造代碼塊,依舊是這個例子,可是需求變了,如今的需求是嬰兒一出生就必須哭,可能說到這,要是有人理解了上面的代碼,確定立刻就能想到,這還不簡單,把哭的方法寫到構造函數中不就好了,對,這樣確實也能夠,可是有弊端,Java要求代碼簡練,能少寫的就很少寫,你先看下面的代碼就知道了
//嬰兒類 public class Baby { int id;//身份證 String name;//名字 //無參構造函數 public Baby(){ cry(); } //有參構造函數 public Baby(int id, String name) { this.id = id; this.name = name; cry(); } //哭 public void cry(){ System.out.println("哇哇的哭。。。。"); } } class Test{ public static void main(String[] args) { //建立一個白戶baby對象 Baby baby = new Baby(222,"小可愛");//白戶 //建立一個黑戶baby對象 Baby baby1 = new Baby();//黑戶 } }
運行結果: 哇哇的哭。。。。 哇哇的哭。。。。
雖然白戶黑戶兩種嬰兒都在出生的時候哭了,可是在兩個構造函數中出現了重複代碼,cry()方法重複了兩次,爲了解決重複代碼這個問題,下面就讓構造代碼塊出場吧!
構造函數的做用:給對應的對象進行初始化
構造代碼塊的做用: 給對象進行統一的初始化
構造代碼塊的格式:
{ 構造代碼塊 }
注意:構造代碼塊的大括號必須位於成員位置上
代碼塊的類別:
1.構造代碼塊
2.局部代碼塊 大括號位於方法以內 做用:縮短局部變量的生命週期,節省一點點內存
3.靜態代碼塊
static{ 靜態代碼塊 }
構造代碼塊要注意的事項:
1.Java編譯器編譯一個Java源文件的時候,會把成員變量的聲明語句提早至一個類的最前端
2.成員變量的初始化工做其實都是在構造函數中進行的
3.一旦通過Java編譯器編譯後,構造代碼塊的代碼就會被移動到構造函數中執行,是在構造函數以前執行的,構造函數中的代碼是最後執行的
4.成員變量的顯式初始化與構造代碼塊的代碼是按照當前代碼的順序執行的
//嬰兒類
public class Baby {
int id;//身份證
String name;//名字
//構造代碼塊
{
cry();
}
//無參構造函數
public Baby(){
}
//有參構造函數
public Baby(int id, String name) {
this.id = id;
this.name = name;
}
//哭
public void cry(){
System.out.println("哇哇的哭。。。。");
}
}
class Test{
public static void main(String[] args) {
//建立一個白戶baby對象
Baby baby = new Baby(222,"小可愛");//白戶
//建立一個黑戶baby對象
Baby baby1 = new Baby();//黑戶
//匿名對象
new Baby();
}
}
運行結果: 哇哇的哭。。。。 哇哇的哭。。。。 哇哇的哭。。。。
//嬰兒類
public class Baby {
int id;//身份證
String name;//名字
//構造代碼塊
{
cry();
}
//無參構造函數
public Baby(){
}
//有參構造函數
public Baby(int id, String name) {
this.id = id;
this.name = name;
}
//哭
public void cry(){
System.out.println("哇哇的哭。。。。");
}
}
class Test{
public static void main(String[] args) {
//局部代碼塊
{
//建立一個白戶baby對象
Baby baby = new Baby(222,"小可愛");//白戶
//建立一個黑戶baby對象
Baby baby1 = new Baby();//黑戶
//匿名對象
new Baby();
}
}
}
所有寫完了,若是你以爲對你有用,記得推薦,若是以爲哪不對,歡迎指正!
本文已獨家受權給腳本之家(jb51net)公衆號獨家發佈