代码一:
类只会被初始化一次。
public class TestCode10 {
static {
System.out.println("TestCode10 init .");
}
public static void main(String[] args) {
Parent10 parent;
System.out.println("---1---");
parent = new Parent10();
System.out.println("---2---");
System.out.println(parent.a);
System.out.println("---3---");
System.out.println(Child10.b);
}
}
class Parent10 {
public static int a = 5;
static {
System.out.println("Parent10 init .");
}
}
class Child10 extends Parent10 {
public static int b = 10;
static {
System.out.println("Child10 init .");
}
}
执行结果:new Parent10() 会引起 Parent10类的初始化。
TestCode10 init .
---1---
Parent10 init .
---2---
5
---3---
Child10 init .
10
=========================分隔符=========================
代码二:
静态变量被调用,只会触发直接定义静态变量的类的初始化。通过子类调用父类的静态变量,不会引起子类的初始化。
class Parent11 {
static {
System.out.println("Parent11 init ~");
}
public static int a = 5;
public static void method() {
System.out.println("parent method is invoked");
}
}
class Child11 extends Parent11 {
static {
System.out.println("Child11 init ~");
}
}
public class TestCode11 {
public static void main(String[] args) {
System.out.println(Child11.a);
System.out.println("------");
Child11.method();
}
}
执行结果:Child11.a 会引起 Child11 类的初始化。
Parent11 init ~
5
------
parent method is invoked
=========================分隔符=========================
代码三:
ClassLoader.loadClass()方法并不会引起类的初始化,只是会引起类的加载。
class CL {
static {
System.out.println("CL init.");
}
}
public class TestCode12 {
public static void main(String[] args) throws ClassNotFoundException {
// 获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
// 类加载器的 loadClass 方法并不能引起类的初始化
Class<?> loadClass = systemClassLoader.loadClass("cn.com.ccxi.jvm.test.CL");
System.out.println(loadClass);
System.out.println("------");
Class<?> clazz = Class.forName("cn.com.ccxi.jvm.test.CL");
System.out.println(clazz);
}
}
执行结果:
class cn.com.ccxi.jvm.test.CL
------
CL init.
class cn.com.ccxi.jvm.test.CL