建立以下Demojava
package com.example.jvm.classloader; class Parent{ static int a = 3; static { System.out.println("Parent static block"); } } class Child extends Parent{ static int b = 4; static { System.out.println("Child static block"); } } public class MyTest9 { static { System.out.println("MyTest9 static block"); } public static void main(String[] args) { System.out.println(Child.b); } }
運行結果jvm
MyTest9 static block Parent static block Child static block 4
建立Demo2blog
package com.example.jvm.classloader; class Parent2{ static int a = 3; static { System.out.println("Parent2 static block"); } } class Child2 extends Parent2{ static int b = 4; static { System.out.println("Child2 static block"); } } public class MyTest10 { static { System.out.println("MyTest10 static block"); //靜態塊被打印,說明該類被初始化了。 } public static void main(String[] args) { Parent2 parent2; System.out.println("______________"); parent2 = new Parent2(); System.out.println(parent2.a); System.out.println("______________"); System.out.println(Child2.b); } }
打印結果:ssl
MyTest10 static block ______________ Parent2 static block 3 ______________ Child2 static block 4
建立Demo3get
class Parent3{ static int a = 3; static { System.out.println("Parent3 static block"); } static void doSomething(){ System.out.println("do something"); } } class Child3 extends Parent3{ static int b = 4; static { System.out.println("Child3 static block"); } } public class MyTest11 { public static void main(String[] args) { //變量定義在哪裏,就是對哪一個類的主動使用。如a定義在Parent3中,那就是對Parent3的主動使用 System.out.println(Child3.a); System.out.println("-----------"); //靜態方法定義在哪裏,就是對哪一個類的主動使用。如doSomething定義在Parent3中,那就是對Parent3的主動使用 Child3.doSomething(); } }
打印結果io
Parent3 static block 3 ----------- do something
四、Demo4 使用反射使類初始化class
class CL{ static { System.out.println("CL static block"); } } public class MyTest12 { public static void main(String[] args) throws Exception{ ClassLoader loader = ClassLoader.getSystemClassLoader(); Class<?> clazz = loader.loadClass("com.example.jvm.classloader.CL"); System.out.println(clazz); System.out.println("-------------"); clazz = Class.forName("com.example.jvm.classloader.CL"); System.out.println(clazz); } }
打印結果變量
class com.example.jvm.classloader.CL ------------- CL static block class com.example.jvm.classloader.CL
說明反射Class.forName會使類初始化。而調用ClassLoader類的loadClass方法加載一個類,並非對類的主動使用,不會致使類的初始化反射