颜群JVM【03】类的初始化
类的初始化:JVM只会在首次主动使用一个类/接口时,才会初始化它们 。
主动使用
1.new 构造类的实例
2.访问类/接口的静态成员(属性、方法)
注:main()本身也是一个静态方法,因此main()的所在类也会被初始化
特殊情况:
- 如果成员变量既是static,又是final ,即常量(放在常量池中),则不会被初始化
- 上一种情况中,如果常量的值是一个随机值,则会被初始化 (为了安全)
3.执行反射时使用的类,比如:Class.forName("");
4.初始化一个子类时,该子类的父类也会被初始化
5.动态语言在执行时所涉及的类也会被初始化(动态代理)
被动使用
除了主动以外,其他都是被动使用。
比如:
java
package init;
class BD
{
static {
System.out.println("BD...");
}
}
public class BeiDong {
public static void main(String[] args) {
BD[] bds = new BD[3];
}
}
以上代码,不属于主动使用类,因此不会被初始化。
常量的产生时机



小测试
