1 classGrandpa{
2 public static String p_StaticField = "祖父类--静态变量";
3 public String p_Field = "祖父类--变量";
4
5 static{
6 System.out.println(p_StaticField);
7 System.out.println("祖父类--静态初始化块");
8 }
9
10 {
11 System.out.println(p_Field);
12 System.out.println("祖父类--初始化块");
13 }
14
15 publicGrandpa() {
16 System.out.println("祖父类--构造器");
17 }
18 }
19
20 class Parent extendsGrandpa{
21
22 public static String p_StaticField = "父类--静态变量";
23
24 public String p_Field = "父类--变量";
25
26 static{
27 System.out.println(p_StaticField);
28 System.out.println("父类--静态初始化块");
29 }
30
31 {
32 System.out.println(p_Field);
33 System.out.println("父类--初始化块");
34 }
35
36 publicParent() {
37 System.out.println("父类--构造器");
38 }
39 }
40 public class SubClass extendsParent {
41
42 public static String s_StaticField = "子类--静态变量";
43
44 public String s_Field = "子类--变量";
45
46 static{
47 System.out.println(s_StaticField);
48 System.out.println("子类--静态初始化块");
49 }
50
51 {
52 System.out.println(s_Field);
53 System.out.println("子类--初始化块");
54 }
55
56 publicSubClass() {
57
58 System.out.println("子类--构造器");
59 }
60
61 public static voidmain(String[] args) {
62 System.out.println("*************in main***************");
63 newSubClass();
64 System.out.println("*************second subClass***************");
65 newSubClass();
66 }
67 }
运行结果:
祖父类--静态变量
祖父类--静态初始化块
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
*************in main***************
祖父类--变量
祖父类--初始化块
祖父类--构造器
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
*************second subClass***************
祖父类--变量
祖父类--初始化块
祖父类--构造器
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
加载顺序:(父类静态成员、静态代码块—>子类静态成员、静态代码块—>父类实例成员、代码块——>父类构造函数—>子类实例成员、代码块—>子类构造函数)
在加载子类时,如果继承于父类,上溯加载,如果父类之上还有父类,再上溯。最后从祖父类依次加载到子类。
先加载静态变量,再静态初始化块。
在实例对象后先加载变量,再初始化,然后调用构造方法。