1.被动使用类字段演示一:
public class NotInitialization {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(SubClass.value);
}
}
class SuperClass{
static
{
System.out.println("SuperClass init!");
}
public static int value = 123 ;
}
class SubClass extends SuperClass{
static {
System.out.println("SubClass init!");
}
}
运行结果:SuperClass init!
123
通过子类引用父类的静态字段,不会导致子类初始化
对于静态字段,只有直接定义这个字段的类才会被初始化,因此通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初使化。
2.被动使用类字段演示二:
public class NotInitialization2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
SuperClass1[] sca = new SuperClass1[10];
}
}
class SuperClass1{
static
{
System.out.println("SuperClass init!");
}
public static int value = 123 ;
}
运行结果:
通过数组定义来引用类,不会触发此类的初使化。
3.被动使用类字段演示三:
public class NotInitialization3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(ConstClass.HELLOWORLD);
}
}
class ConstClass{
static{
System.out.println("ConstClass init!");
}
public static final String HELLOWORLD = "hello world";
}
运行结果:hello world
常量在编译阶段会存入调用类的常量池中,本质上没有直接引用到定义常量的类,因此不会触发定义常量
的类的初始化。