靜態代碼塊,在類加載時可以執行,但不一定會執行
下面列舉不同的類的加載方式,靜態代碼塊的執行狀況:
class ClassA{ //靜態代碼塊,在類加載時可以執行,但不一定會執行 static { System.out.println("static{}"); } } //-XX:+TraceClassLoading public class TestClassObject02 { public static void main(String[] args) throws Exception { //定義變量時不會觸發類加載 //Class<?> c0; //類的加載方式1 //Class<?> c1 = ClassA.class;//不會執行靜態代碼塊 //類的加載方式2 //Class.forName("com.java.oop.ClassA");//會執行靜態代碼塊 //類的加載方式3 /*ClassLoader loader = ClassLoader.getSystemClassLoader(); Class.forName("com.java.oop.ClassA", false,//不指定static{},true,指定 loader);*/ //類的加載方式4 /*Class.forName("com.java.oop.ClassA", false,//不指定static{},true,指定 ClassLoader.getSystemClassLoader());*/ //不指定static{} loader //類的加載方式5 ClassLoader loader = ClassLoader.getSystemClassLoader(); loader.loadClass("com.java.oop.ClassA");//不會執行靜態代碼塊 } }