分析类初始化!
什么时候类会初始化
主动引用
- main方法被调用时,其所在的类会首先被初始化
- new一个类对象
- 调用类的静态成员和方法(除了final常量)
- 反射调用时
- 初始化子类时,其父类如果没被初始化,则先去初始化父类
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
//通过new一个类对象
Son son = new Son();
//通过反射加载
Class.forName("com.geek.pritice.Son");
}
}
class Father{
static {
System.out.println("这里是Father");
}
}
class Son extends Father{
static {
System.out.println("这里是Son");
}
}
结果如下:
分析:因为一次程序执行,类只会加载一次,所以只显示一遍静态代码
类的被动引用
- 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:通过子类访问其父类的静态变量时,子类不会被初始化
- 通过数组定义类的引用 如 : Study[] num = new Study[10];
- 引用常量(常量在链接阶段就已经存入常量池中了)