(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