小编的上一篇博客: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 }
以上代码的执行结果如下: