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 }

类的初始化块,可以在类中使用“{”和“}”将语句包围起来,直接将其作为类的成员。类的这种“没有名字”的“成员”,多用于初始化类的字段。

public int field=100;  在定义时进行初始化,此时field = 100;System.out.println(obj.field); 输出field的值100。

obj=new InitializeBlockClass(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 }

原文地址:https://www.cnblogs.com/Nojava/p/13779364.html