? ? ? ?序言:? ? ? ? ?

          ? ? ? ? ? ? ? ?
          今天回想這幾天走過的Java路程,發(fā)現(xiàn)漏了一個(gè)點(diǎn),就是構(gòu)造代碼塊,我絞盡腦汁,也沒想起來它的作用,我騙不了我自己,就搜相關(guān)資料,重新學(xué)習(xí),在學(xué)習(xí)的過程中發(fā)現(xiàn)構(gòu)造代碼塊和構(gòu)造函數(shù)有一定的聯(lián)系,為了捕捉這種聯(lián)系,我總結(jié)了一個(gè)案例,這個(gè)案例能加深你對構(gòu)造函數(shù)和構(gòu)造代碼塊的理解。我寫這個(gè)博客一是為了避免下次再被構(gòu)造代碼塊這塊石頭絆倒,二是為了能給需要解惑的人提供一些幫助,還是那句話:

          ? ? ? ? ? ? ?越懂得與人分享,你的價(jià)值增值越大!

          ?

          ? ? ? ? ??看代碼前要先明白一個(gè)需求:

          ? ? ? ? ? ? ? ? ? ? ? ? ?使用Java類描述一個(gè)嬰兒,假設(shè)現(xiàn)在兩種嬰兒,一種嬰兒是一出生就有了名字,我們把這種嬰兒叫白戶
          ,另一種嬰兒是出生后才有了名字,我們把這種嬰兒叫黑戶。(為了方便理解,我把剛出生就已經(jīng)有名字的叫白戶,把出生后才起名的叫黑戶)

          ?
          //嬰兒類
          public class Baby { int id;//身份證 String name;//名字 //哭 public void cry(){
          System.out.println(name+"哇哇的哭。。。。"); } } class Test{ public static void
          main(String[] args) { //創(chuàng)建一個(gè)baby對象 Baby baby = new Baby();//嬰兒出生 baby.id=111;
          baby.name="小娃娃";//黑戶 baby.cry(); } }


          ?

            
          運(yùn)行結(jié)果: 小娃娃哇哇的哭。。。。
            

          ?

          由于小娃娃是出生之后才賦的值,所以小娃娃是黑戶,我們現(xiàn)在要讓嬰兒一出生就有名字,就要用構(gòu)造函數(shù)。

          構(gòu)造函數(shù)的作用:? ? 給對應(yīng)的對象進(jìn)行初始化

          構(gòu)造函數(shù)定義的格式:
          修飾符 函數(shù)名(形式參數(shù)){ 函數(shù)體。。。 }
          ?

            

          ?

          構(gòu)造函數(shù)要注意的細(xì)節(jié):

          1.構(gòu)造函數(shù)沒有返回值類型

          2.構(gòu)造函數(shù)的函數(shù)名必須要與類名一致

          3.構(gòu)造函數(shù)并不是由我們手動調(diào)用的,而是在創(chuàng)建對應(yīng)的對象時(shí),jvm就會主動調(diào)用到對應(yīng)的構(gòu)造函數(shù)

          4.如果一個(gè)類沒有顯式的寫上一個(gè)構(gòu)造方法時(shí),Java編譯器會為該類添加一個(gè)無參的構(gòu)造方法

          5.如果一個(gè)類已經(jīng)顯示的寫上一個(gè)構(gòu)造方法時(shí),Java編譯器不會再為該類添加無參的構(gòu)造方法

          6.構(gòu)造函數(shù)是可以在一個(gè)類中以函數(shù)重載的形式存在多個(gè)的

          ?

          ?
          //嬰兒類 public class Baby { int id;//身份證 String name;//名字 //無參構(gòu)造函數(shù) public
          Baby(){ } //有參構(gòu)造函數(shù) public Baby(int id, String name) { this.id = id; this.name =
          name; System.out.println("Baby的屬性初始化完畢?。。?quot;); } //哭 public void cry(){
          System.out.println(this.name+"哇哇的哭。。。。"); } } class Test{ public static void
          main(String[] args) { //創(chuàng)建一個(gè)baby對象 Baby baby = new Baby(222,"小可愛");//嬰兒出生 白戶
          baby.cry(); } }
          ?

            
          運(yùn)行結(jié)果: Baby的屬性初始化完畢?。?! 小可愛哇哇的哭。。。。
            


          通過上面的黑戶和白戶,我們能對構(gòu)造函數(shù)有個(gè)深刻的理解,下面我再引申出構(gòu)造代碼塊,依舊是這個(gè)例子,但是需求變了,現(xiàn)在的需求是嬰兒一出生就必須哭,可能說到這,要是有人理解了上面的代碼,肯定馬上就能想到,這還不簡單,把哭的方法寫到構(gòu)造函數(shù)中不就行了,對,這樣確實(shí)也可以,但是有弊端,Java要求代碼簡練,能少寫的就不多寫,你先看下面的代碼就知道了

          ?

          ?
          //嬰兒類 public class Baby { int id;//身份證 String name;//名字 //無參構(gòu)造函數(shù) public
          Baby(){ cry(); } //有參構(gòu)造函數(shù) 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) { //創(chuàng)建一個(gè)白戶baby對象 Baby baby = new Baby(222,"小可愛");//白戶
          //創(chuàng)建一個(gè)黑戶baby對象 Baby baby1 = new Baby();//黑戶 } }
          ?

            
          運(yùn)行結(jié)果: 哇哇的哭。。。。 哇哇的哭。。。。
            

          ?

          ?

          雖然白戶黑戶兩種嬰兒都在出生的時(shí)候哭了,但是在兩個(gè)構(gòu)造函數(shù)中出現(xiàn)了重復(fù)代碼,cry()方法重復(fù)了兩次,為了解決重復(fù)代碼這個(gè)問題,下面就讓構(gòu)造代碼塊出場吧!

          ?

          構(gòu)造函數(shù)的作用:給對應(yīng)的對象進(jìn)行初始化

          構(gòu)造代碼塊的作用:? 給對象進(jìn)行統(tǒng)一的初始化

          ?

          構(gòu)造代碼塊的格式:

          ?
          { 構(gòu)造代碼塊 }
          ?

            

          注意:構(gòu)造代碼塊的大括號必須位于成員位置上

          ?

          代碼塊的類別:

          1.構(gòu)造代碼塊

          2.局部代碼塊? ? ? ? 大括號位于方法之內(nèi)? ? ? ?作用:縮短局部變量的生命周期,節(jié)省一點(diǎn)點(diǎn)內(nèi)存

          3.靜態(tài)代碼塊
          static{ 靜態(tài)代碼塊 }
            

          ?

          構(gòu)造代碼塊要注意的事項(xiàng):


          1.Java編譯器編譯一個(gè)Java源文件的時(shí)候,會把成員變量的聲明語句提前至一個(gè)類的最前端

          2.成員變量的初始化工作其實(shí)都是在構(gòu)造函數(shù)中進(jìn)行的

          3.一旦經(jīng)過Java編譯器編譯后,構(gòu)造代碼塊的代碼就會被移動到構(gòu)造函數(shù)中執(zhí)行,是在構(gòu)造函數(shù)之前執(zhí)行的,構(gòu)造函數(shù)中的代碼是最后執(zhí)行的

          4.成員變量的顯式初始化與構(gòu)造代碼塊的代碼是按照當(dāng)前代碼的順序執(zhí)行的
          //嬰兒類 public class Baby { int id;//身份證 String name;//名字 //構(gòu)造代碼塊 { cry(); }
          //無參構(gòu)造函數(shù) public Baby(){ } //有參構(gòu)造函數(shù) 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) { //創(chuàng)建一個(gè)白戶baby對象 Baby
          baby = new Baby(222,"小可愛");//白戶 //創(chuàng)建一個(gè)黑戶baby對象 Baby baby1 = new Baby();//黑戶
          //匿名對象 new Baby(); } }
            
          運(yùn)行結(jié)果: 哇哇的哭。。。。 哇哇的哭。。。。 哇哇的哭。。。。
            

          ?
          //嬰兒類 public class Baby { int id;//身份證 String name;//名字 //構(gòu)造代碼塊 { cry(); }
          //無參構(gòu)造函數(shù) public Baby(){ } //有參構(gòu)造函數(shù) 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) { //局部代碼塊 {
          //創(chuàng)建一個(gè)白戶baby對象 Baby baby = new Baby(222,"小可愛");//白戶 //創(chuàng)建一個(gè)黑戶baby對象 Baby baby1 =
          new Baby();//黑戶 //匿名對象 new Baby(); } } }
            

          ?

          全部寫完了,如果你覺得對你有用,記得推薦,如果覺得哪不對,歡迎指正!

          ??本文已獨(dú)家授權(quán)給腳本之家(jb51net)公眾號獨(dú)家發(fā)布

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                久草综合视频 | 揉捏小核高潮不停颤抖 | 丰满又大又圆又白的美乳美女 | 超碰人人操人人操 | 国产亚洲欧美性爱 |