先来讲一下代码块:
静态代码块(类初始化块):在类中static{},JVM加载类时执行,用于初始化类,仅执行一次
构造代码块(实例初始化块) :在类的内部直接用{}定义,初始化对象,每一次创建对象时执行
普通代码块 :在方法或语句中出现的{}就称为普通代码块,用完就释放,不用等方法执行完
代码块之间的初始化顺序:静态块>main()>构造块>构造方法
1.方法和属性的顺序:非静态的初始化顺序是先属性后方法;
静态的初始化顺序是先属性后方法
2.属性和属性的顺序:非静态属性无顺序;
静态属性有上下顺序,上面先初始化
非继承情况下类的初始化顺序:
静态变量
静态块
变量
构造块
构造器
举例:
public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量"; // 变量 public String field = "变量"; // 静态初始化块 static { System.out.println(staticField); System.out.println("静态初始化块"); } // 初始化块 { System.out.println(field); System.out.println("初始化块"); } // 构造器 public InitialOrderTest() { System.out.println("构造器"); } public static void main(String[] args) { new InitialOrderTest(); } }
输出结果:
静态变量
静态初始化块
变量
初始化块
构造器
继承情况下类的初始化顺序:
父类静态变量
父类静态块
子类静态变量
子类静态块
子类main方法
父类变量
父类构造块
父类构造器
子类变量
子类构造块
子类构造器
举例:
public class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量"; // 变量 public String p_Field = "父类--变量"; protected int i = 9; protected int j = 0; // 静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类--静态初始化块"); } // 初始化块 { System.out.println(p_Field); System.out.println("父类--初始化块"); } // 构造器 public Parent() { System.out.println("父类--构造器"); System.out.println("i=" + i + ", j=" + j); j = 20; } } class SubClass extends Parent { // 静态变量 public static String s_StaticField = "子类--静态变量"; // 变量 public String s_Field = "子类--变量"; // 静态初始化块 static { System.out.println(s_StaticField); System.out.println("子类--静态初始化块"); } // 初始化块 { System.out.println(s_Field); System.out.println("子类--初始化块"); } // 构造器 public SubClass() { System.out.println("子类--构造器"); System.out.println("i=" + i + ",j=" + j); } // 程序入口 public static void main(String[] args) { System.out.println("子类main方法"); new SubClass(); } }
输出结果:
父类--静态变量 父类--静态初始化块 子类--静态变量 子类--静态初始化块 子类main方法 父类--变量 父类--初始化块 父类--构造器 i=9, j=0 子类--变量 子类--初始化块 子类--构造器 i=9,j=20
参考链接:http://blog.sina.com.cn/s/blog_4cc16fc50100bjjp.html
原文:https://www.cnblogs.com/here-I-am/p/11644015.html