小编的上一篇博客:JAVA代码的执行顺序一简单的讨论了一下,此篇博客深入讨论一下JAVA类初始化的顺序

考虑继承关系,静态成员字段/对象,普通的成员字段/对象:子类与父类的执行顺序是: 
1、先执行父类的静态代码块(父1) /静态成员字段/对象 [静态对象,静态代码块顺序执行]
2、子类的静态代码块(子1)  /静态成员字段/对象

3、父类构造代码块(父2) /包括成员字段或对象 [普通的对象,代码块顺序执行]
4、父类构造方法(父3) 
5、子类构造代码块(子2) /包括成员字段或对象 [普通的对象,代码块顺序执行]
6、子类构造方法(子3)

初始化对象成功

 

1.有继承关系的类,先在执行父类中执行,在到子类中执行;

2.static修饰(特别注意的是static修饰的成员对象,静态代码块),顺序执行;

3.非static修饰(特别注意的是成员对象,代码块/如{int a=0;}),顺序执行;

我们先来看一份简单的代码:

注意:代码中的static成员对象,static代码块;普通的成员对象,代码块;有继承关系

 1 package com.gzu.pyu.thinking.in.java;
 2 
 3 public class JavaExecutionOrder3 {
 4     
 5     public static void main(String args[]){
 6         System.out.println("Start Java Execution Order:");
 7         B b = new B();
 8     }
 9 }
10 
11 class A{
12     C c =new C();
13     {
14         System.out.println("TestA's Code block");
15     }
16     
17     static {
18         System.out.println("TestA's Static code block");
19     }
20     
21     public A(){
22         System.out.println("TestA's Constructor");
23     }
24 }
25 
26 class B extends A{
27     //注意:静态成员对象,和非静态成员对象的初始化顺序和实际
28     static C c =new C();
29     D d = new D();
30     
31     static {
32         System.out.println("TestB's Static code block");
33     }
34     
35     {
36         System.out.println("TestB's Code block");
37     }
38     
39     public B(){
40         System.out.println("TestB's Constructor");
41     }
42 }
43 
44 class C {
45     static {
46         System.out.println("TestC's Static code block");
47     }
48     
49     {
50         System.out.println("TestC's Code block");
51     }
52     
53     public C(){
54         System.out.println("TestC's Constructor");
55     }
56 }
57 
58 class D{
59     static {
60         System.out.println("TestD's Static code block");
61     }
62     
63     {
64         System.out.println("TestD's Code block");
65     }
66     
67     public D(){
68         System.out.println("TestD's Constructor");
69     }
70 }

 

  以上代码的执行结果如下: