下段代码为何报错(new Foo())?
1 public class Practice { 2 public static void main(String[] args) { 3 Foo obj1 = new Foo(); 4 } 5 } 6 class Foo{ 7 int value; 8 public Foo(int initValue) { 9 value = initValue; 10 } 11 }
原因:若类提供了一个自定义的构造方法,将导致系统不再提供默认的构造方法。
运行下段代码:
1 class Root 2 { 3 static{ 4 System.out.println("Root的静态初始化块"); 5 } 6 { 7 System.out.println("Root的普通初始化块"); 8 } 9 public Root() 10 { 11 System.out.println("Root的无参数的构造器"); 12 } 13 } 14 class Mid extends Root 15 { 16 static{ 17 System.out.println("Mid的静态初始化块"); 18 } 19 { 20 System.out.println("Mid的普通初始化块"); 21 } 22 public Mid() 23 { 24 System.out.println("Mid的无参数的构造器"); 25 } 26 public Mid(String msg) 27 { 28 //通过this调用同一类中重载的构造器 29 this(); 30 System.out.println("Mid的带参数构造器,其参数值:" + msg); 31 } 32 } 33 class Leaf extends Mid 34 { 35 static{ 36 System.out.println("Leaf的静态初始化块"); 37 } 38 { 39 System.out.println("Leaf的普通初始化块"); 40 } 41 public Leaf() 42 { 43 //通过super调用父类中有一个字符串参数的构造器 44 super("Java初始化顺序演示"); 45 System.out.println("执行Leaf的构造器"); 46 } 47 48 } 49 50 public class TestStaticInitializeBlock 51 { 52 public static void main(String[] args) 53 { 54 new Leaf(); 55 56 57 } 58 }
静态初始化块执行顺序:
运行时先执行static,即静态的初始化块,顺序是由父类先开始执行,再执行子类;之后由父类先开始执行普通的初始化块,再执行无参构造方法,最后执行有参构造方法,父类执行完之后子类开始执行,顺序不变。