public class Main3 {
static{
System.out.println("Main.static");
}
public static void main(String[] args){
System.out.println(Test.a);
new Test();
new Test();
}
}
class Test{
static {
System.out.println("Test.static");
}
public static final String a="Test.final";
Test(){
System.out.println("Test.new");
}
{
System.out.println("Test.notstatic");
}
}
运行结果:
将两个new Test() 注释掉,结果变成
当类被引用的加载,类只会加载一次
public class Main3 {
public static void main(String[] args) throws ClassNotFoundException{
ClassLoader classloader=ClassLoader.getSystemClassLoader();
Class<?> clazz=classloader.loadClass("Test");
System.out.println("Main.main");
Class.forName("Test");
}
}
class Test{
static{
System.out.println("Main.static");
}
}
运行结果:
- 类的主动引用(一定会发生类的初始化)
- new一个类的对象
- 调用类的静态成员(除了final常量)和静态方法
- 使用java.lang.reflect包的方法对类进行反射调用
- 当虚拟机启动,java Demo01,则一定会初始化Demo01类,说白了就是先启动main方法所在的类
- 当初始化一个类,如果其父类没有被初始化,则先初始化它父类
- 类的被动引用(不会发生类的初始化)
- 当访问一个静态域时,只有真正声名这个域的类才会被初始化
- 通过子类引用父类的静态变量,不会导致子类初始化
- 通过数组定义类的引用,不会触发此类初始化
- 引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)
- 当访问一个静态域时,只有真正声名这个域的类才会被初始化