序言:
今天回想這幾天走過的Java路程,發現漏了一個點,就是構造程式碼塊,我絞盡腦汁,也沒想起來它的作用,我騙不了我自己,就搜相關資料,重新學習,在學習的過程中發現構造程式碼塊和建構函式有一定的聯絡,為了捕捉這種聯絡,我總結了一個案例,這個案例能加深你對建構函式和構造程式碼塊的理解。我寫這個部落格一是為了避免下次再被構造程式碼塊這塊石頭絆倒,二是為了能給需要解惑的人提供一些幫助,還是那句話:
越懂得與人分享,你的價值增值越大!
看程式碼前要先明白一個需求:
使用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(); } }
執行結果: 小娃娃哇哇的哭。。。。
由於小娃娃是出生之後才賦的值,所以小娃娃是黑戶,我們現在要讓嬰兒一出生就有名字,就要用建構函式。
建構函式的作用: 給對應的物件進行初始化
建構函式定義的格式:
修飾符 函式名(形式引數){ 函式體。。。 }
建構函式要注意的細節:
1.建構函式沒有返回值型別
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();
}
}
}
全部寫完了,如果你覺得對你有用,記得推薦,如果覺得哪不對,歡迎指正!