1. 程式人生 > 實用技巧 >2020.10.7(動手動腦)

2020.10.7(動手動腦)

(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 }