package com.henry.classloader;
import java.util.Random;
class Init{
//编译时就可以确定下面常量的值,所以加载(使用"类名.class,Class.forName")Class时不进行初始化
//并且对静态常数值的引用也不会导致初始化 操作
static final int staticFinal=47;
static final int staticFinal2=2;
static{
System.out.println("Init");
}
};
class Init2{
//加载(使用"类名.class")Class时不进行初始化,初始化操作延迟到对静态方法(构造器隐式静态)或者是非常数静态域的首次引用
//对非常数静态域初次使用时先进行链接(分配存储空间),再进行初始化
//加载使用(Class.forName)Class时,立刻进行初始化
static int staticNonFinal=74;
static{
//先执行下述语句,再打印出上述静态变量
System.out.println("init2");
}
}
class Init3{
static int staticNonFinal=74;
static{
System.out.println("init3");
}
}
public class ClassTest4 {
public static Random random=new Random(47);
public static void main(String[] args)throws Exception {
Class initClass=Init.class;
System.out.println("after creating init ref");
System.out.println(Init.staticFinal);
System.out.println(Init.staticFinal2);
System.out.println(Init2.staticNonFinal);
//使用“类名.class"方法产生的Class不会进行初始化,初始化操作延迟到对静态方法(构造器隐式静态)或者是非常数静态域的首次引用
// Class initClass3=Init3.class;
Class initClass3=Class.forName("com.henry.classloader.Init3");
System.out.println("after creating init3 ref");
System.out.println(Init3.staticNonFinal);
}
}