1. 程式人生 > >Java的動手動腦(四)

Java的動手動腦(四)

日期:2018.10.18

星期四

部落格期:019

 

  Part1:回答為啥會報錯

  答案:當然會報錯啦!因為平常的程式設計過程中,系統會對我們寫的類自動生成一個預設無參形式的構造方法,類似於C++中的體制!這個在你寫了構造方法之後,系統就不會再自動為你分配一個無參的構造方法了。所以在圖中的Foo類中只有一個帶一個int型別引數的構造方法,在呼叫無參的構造方法時就會報錯!

 

  Part 2:執行下列程式碼,總結以下構造順序

 1 package teacherMake;
 2 
 3 class Root
 4 {
 5     static
{ 6 System.out.println("Root的靜態初始化塊"); 7 } 8 { 9 System.out.println("Root的普通初始化塊"); 10 } 11 public Root() 12 { 13 System.out.println("Root的無引數的構造器"); 14 } 15 } 16 class Mid extends Root 17 { 18 static{ 19 System.out.println("Mid的靜態初始化塊");
20 } 21 { 22 System.out.println("Mid的普通初始化塊"); 23 } 24 public Mid() 25 { 26 System.out.println("Mid的無引數的構造器"); 27 } 28 public Mid(String msg) 29 { 30 //通過this呼叫同一類中過載的構造器 31 this(); 32 System.out.println("Mid的帶引數構造器,其引數值:" + msg); 33
} 34 } 35 class Leaf extends Mid 36 { 37 static{ 38 System.out.println("Leaf的靜態初始化塊"); 39 } 40 { 41 System.out.println("Leaf的普通初始化塊"); 42 } 43 public Leaf() 44 { 45 //通過super呼叫父類中有一個字串引數的構造器 46 super("Java初始化順序演示"); 47 System.out.println("執行Leaf的構造器"); 48 } 49 50 } 51 52 public class TestStaticInitializeBlock 53 { 54 public static void main(String[] args) 55 { 56 new Leaf(); 57 58 59 } 60 }
TestStaticInitializeBlock

  先顯示一下結果:

 

  好了,總結以下順序:

    先是執行靜態初始化塊,為什麼呢?其實就是一個靜態資料不同於成員資料的一點,它是先於在系統外部宣告構造的,因而會放在最初構造!而其內部也是通過先呼叫基類(C++概念)[子類]的資料構造,在呼叫自身的構造;之後的順序就看你的構造方法是怎麼寫的了,主要在於宣告順序,在C++裡是按順序先構造基類的成員(內部也是按照宣告順序),Java類似,因為是子類繼承父類的成員先構造子類,而且Java不允許多重繼承(注意:不是多繼承),因而不會有父類的繼承順序(就像老師說的,在Java的“憲法”裡,一個“兒子”只准有一個“爹”,哈哈哈),差不多就是父類---->子類的順序了;再深化一點兒?行吧!我剛剛測試了一下程式,如下圖。老師說父類的構造必須先寫,我就不信!!!我就要試!!!結果雖然是我敗了,但精神可嘉啊!!!至少我清楚的認識到了,老師沒有惡意修改Java的”憲法“!嘿嘿!那順序就是固定的了!(如果覺得不正確,可以留言)

  Part 3: 執行程式碼說明結果

  結果如下:

  是的,這就是每一次初始化會更新掉之前的儲存資料的原因!