运行:ava -XX:+TraceClassLoading Test.class
public class Test {
static Class c = C4.class;// 加载,单没有初始化
static C2 c2 = new C2();// 加载,并没有初始化
static {
System.out.println("test init");
}
C3 c3 = new C3(); // 未加载
final C4 c4 = null; // 未加载
public static void main(String[] args) {
int a = 1;
if (a==1) {
return;
}
System.out.println(C1.m); // 未加载
}
}
class C1 {
static {
System.out.println("c1 init");
}
static int m;
}
class C2 {
static {
System.out.println("c2 init");
}
}
class C3 {
static {
System.out.println("c3 init");
}
}
class C4 {
static {
System.out.println("c4 init");
}
}
输出:
。。。 。。。
[Loaded Test from file:/F:/workspace/owncharge/Test/bin/]
[Loaded java.lang.Void from E:\ProgranFiles\jdk1.7.0_79\jre\lib\rt.jar]
[Loaded C4 from file:/F:/workspace/owncharge/Test/bin/]
[Loaded C2 from file:/F:/workspace/owncharge/Test/bin/]
c2 init
test init
。。。 。。。
结论:
仅仅定义,而没有执行到的语句,不会导致另一个类加载。
被动引用只会加载类,而不初始化,如:
Class a = A,class;
A[] a = new A[1];
sub.f();//f()为父类的方法