创建如下Demo
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); } }
运行结果
MyTest9 static block Parent static block Child static block 4
创建Demo2
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); } }
打印结果:
MyTest10 static block ______________ Parent2 static block 3 ______________ Child2 static block 4
创建Demo3
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(); } }
打印结果
Parent3 static block 3 ----------- do something
4、Demo4 使用反射使类初始化
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方法加载一个类,并不是对类的主动使用,不会导致类的初始化