类的初始化(5种主动使用引发)
2019-04-22 本文已影响0人
树心图物
1、遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,类如果没初始化就会被初始化,创建对象,读取或设置静态字段,调用静态方法。有例外,访问即static又final的常量。
2、反射
3、子类初始化前会先初始化父类
4、包含main方法的类,虚拟机启动时会先初始化该类
5、使用jdk的动态语言支持时(不明)
接口有些不同(在5种中的其中子类引起父类初始化这一种上不同),不管是子接口还是实现了接口的类初始化都不会自动触发父接口或所实现接口的初始化,除非真正用到父接口时才初始化(比如访问到接口中的静态变量),在hotspot中调用类所实现的相应接口的方法都不会造成相应接口的初始化(待进一步确认,不过认为这是合理的,因为是否实现的接口的方法在编译时检查,实现类中肯定有相应的方法了,没必要初始化接口)。调用类中的static final常量时并不会触发该类的初始化,但是调用接口中的static final常量时便会触发该接口的初始化。