子类使用父类的静态字段时,只有直接定义这个字段的父类会被初始化。
public class JVMTest {
public static void main(String[] args) {
System.out.println(Son.a);
}
}
class Father{
public static int a=1;
static {
System.out.println("父类初始化");
}
}
class Son extends Father{
static {
System.out.println("子类初始化");
}
}
结果:子类未被初始化
通过数组定义来使用类。
定义单独一个对象
public class JVMTest {
public static void main(String[] args) {
Father father=new Father();
}
}
class Father{
public static int a=1;
static {
System.out.println("父类初始化");
}
}
父类被初始化了
通过数组定义
public class JVMTest {
public static void main(String[] args) {
Father[] fathers=new Father[10];
}
}
class Father{
public static int a=1;
static {
System.out.println("父类初始化");
}
}
不会初始化
常量在编译期会存入调用类的常量池,因此不会初始化定义常量的类。
public class JVMTest {
public static void main(String[] args) {
System.out.println(Father.b);
}
}
class Father{
public static int a=1;
public static final int b=1;
static {
System.out.println("父类初始化");
}
}
定义常量b的Father类没有被初始化