下段代码为何报错(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,即静态的初始化块,顺序是由父类先开始执行,再执行子类;之后由父类先开始执行普通的初始化块,再执行无参构造方法,最后执行有参构造方法,父类执行完之后子类开始执行,顺序不变。