会导致类初始化的情况
子类访问父类的静态变量,只会触发父类的初始化
Class.forName和 new 会导致初始化,
不会导致类初始化的情况
访问类的 static final 静态常量(基本类型和字符串)不会触发初始化类对象
.class 不会触发初始化
创建该类的数组不会触发初始化
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
Class clazz=classLoader.loadClass(“A”);
类加载器加载类不会初始化
public class Test {
public static void main(String[] args) {
System.out.print(B.c);
}
}
class A {
public static String c = "C";
static {
System.out.print("A");
}
}
class B extends A{
static {
System.out.print("B");
}
}
输出AC
public class Test {
public static void main(String[] args) {
System.out.print(B.c);
}
}
class A {
static {
System.out.print("A");
}
}
class B extends A{
static {
System.out.print("B");
}
public final static String c = "C";
}
输出C
public class Test {
public static void main(String[] args) {
System.out.println(Test2.a);
}
}
class Test2{
static {
System.out.print("OK");
}
public static final String a=new String("JD");
}
或
class Test2{
public static final String a=new String("JD");
static {
System.out.print("OK");
}
}
输出OKJD
输出OKJD是因为会先在常量池中创建jd字符串,但是在堆中的操作,却是要等到初始化阶段才行,所以此时的a是一个经过初始化节点的常量,所以static块当然也会被执行。