2020.10.7(動手動腦)
阿新 • • 發佈:2020-10-08
(1).
原因:如果類提供了一個自定義的構造方法,將導致系統不再提供預設構造方法。
(2).
1 public class InitializeBlockClass { 2 { 3 field=200; 4 } 5 public int field=100; 6 public InitializeBlockClass(int value) { 7 this.field=value; 8 } 9 public InitializeBlockClass() { 10 11 }12 public static void main(String[] args) { 13 InitializeBlockClass obj=new InitializeBlockClass(); 14 System.out.println(obj.field); 15 obj=new InitializeBlockClass(300); 16 System.out.println(obj.field); 17 } 18 }
類的初始化塊,可以在類中使用“{”和“}”將語句包圍起來,直接將其作為類的成員。類的這種“沒有名字”的“成員”,多用於初始化類的欄位。
publicintfield=100;在定義時進行初始化,此時field=100;System.out.println(obj.field);輸出field的值100。
obj=newInitializeBlockClass(300);System.out.println(obj.field);利用構造方法進行初始化,field的值初始化為300,輸出300。
規律:
1.執行類成員定義時指定的預設值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”。
2.執行類的建構函式。。
(3).
1 class Root 2 { 3 static 4 { 5 System.out.println("Root的靜態初始化塊");6 } 7 { 8 System.out.println("Root的普通初始化塊"); 9 } 10 public Root() 11 { 12 System.out.println("Root的無引數的構造器"); 13 } 14 } 15 class Mid extends Root 16 { 17 static 18 { 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 { 39 System.out.println("Leaf的靜態初始化塊"); 40 } 41 { 42 System.out.println("Leaf的普通初始化塊"); 43 } 44 public Leaf() 45 { 46 //通過super呼叫父類中有一個字串引數的構造器 47 super("Java初始化順序演示"); 48 System.out.println("執行Leaf的構造器"); 49 } 50 51 } 52 53 public class TestStaticInitializeBlock 54 { 55 public static void main(String[] args) 56 { 57 new Leaf(); 58 59 60 } 61 }
總結:
所有的靜態初始化塊都優先執行,其次才是非靜態的初始化塊和建構函式,它們的執行順序是:父類的靜態初始化塊>子類的靜態初始化塊>父類的初始化塊>父類的建構函式>子類的初始化塊>子類的建構函式.
靜態初始化塊只執行一次。
建立子型別的物件時,也會導致父型別的靜態初始化塊的執行。
(4).
1 public class staticplay { 2 public static void play(staticplay s1) { 3 System.out.println("靜態方法"); 4 s1.play1(); 5 System.out.println("靜態方法"); 6 } 7 public void play1() { 8 System.out.println("動態方法"); 9 } 10 public static void main(String[] args) { 11 staticplay s=new staticplay(); 12 play(s); 13 } 14 }