类的初始化顺序
类的初始化顺序要在两种情况下讨论,一种是无继承,一种是有继承。
一:构造块之间的的顺序
静态代码块(类初始化块):在类中static{},JVM加载类时执行,用于初始化类,仅执行一次
构造代码块(实例初始化块) :在类的内部直接用{}定义,初始化对象,每一次创建对象时执行
普通代码块 :在方法或语句中出现的{}就称为普通代码块,用完就释放,不用等方法执行完
代码块之间的初始化顺序:静态块>main()>构造块>构造方法
这里简单说一下main()方法
public static void main (String args []) { //main :就是为了让jvm去调用的方法 // public :jvm调用这个方法,要使用最大权限 // static :jvm调用时是不需要创建对象的,直接使用类名调就行 // main :不是关键字, jvm 只认识 main这个词 // String[] args :接收键盘输入的值 }
二:方法和属性之间的顺序
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