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