在Java中一个类包括:构造块、构造方法、静态块、main方法、普通方法。
通过下面的例子将看出一个类中各种方法的执行顺序:
1 /** 2 * @author zhengbinMac 3 */ 4 public class Test2 { 5 static { 6 System.out.println("静态块"); 7 } 8 public Test2() { 9 System.out.println("构造方法");10 }11 {12 System.out.println("构造块");13 }14 public void ok() {15 System.out.println("OK()");16 }17 public static void main(String[] args) {18 System.out.println("main()");19 Test2 t2 = new Test2();20 System.out.println("new Test2");21 t2.ok();22 }23 }24 /*25 静态块26 main()27 构造块28 构造方法29 new Test230 OK()31 */
可以得出:首先JVM加载这个类(执行静态块)-》执行类的入口main方法-》构造块-》构造方法-》执行调用方法
如果有父类呢?JVM首先会检查当前类的父类是否加载,若没有则加载其父类,然后再加载自己,通过下面的测试说明:
1 /** 2 * @author zhengbinMac 3 */ 4 public class Son extends father { 5 { 6 System.out.println("Son-构造块"); 7 } 8 static { 9 System.out.println("Son-静态块");10 }11 public Son() {12 System.out.println("Son-构造方法");13 }14 15 @Override16 public void t1() {17 System.out.println("Son()");18 }19 public static void main(String[] args) {20 System.out.println("main()");21 Son t = new Son();22 t.t1();23 }24 }25 26 class father {27 {28 System.out.println("Father-构造块");29 }30 31 static {32 System.out.println("Father-静态块");33 }34 35 public father() {36 System.out.println("Father-构造方法");37 }38 39 public void t1() {40 System.out.println("Father()");41 }42 }
// 输出/*Father-静态块Son-静态块main()Father-构造块Father-构造方法Son-构造块Son-构造方法Son()*/
其中静态块,用static关键字声明,JVM加载类时执行,仅执行一次。
其中构造块,类中直接用{}声明,在每次创建对象时执行。
注意,静态块会按照声明的顺序执行。如下面这两个例子: