Java中对类的主动引用和被动引用

1、遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,类如果没初始化就会被初始化,创建对象,读取或设置静态字段,调用静态方法。
2、反射
3、子类初始化前会先初始化父类
4、包含main方法的类,虚拟机启动时会先初始化该类 
5、使用jdk的动态语言支持时(不明)
这五种场景被称为主动引用。
 
被动引用:
class SuperClass{
    static{
        syso("super init");
    }
public static int value=123;
}
class SubClass extends SuperClass{
    static{
        syso("sub init")}
}
public class ConstantClass{
        public static final HW="helloworld";
}
public class NotInitialization{
        main(){
        syso( SubClass.value)
        //SuperClass sc[] =new SuperClass[10]
        //syso(ConstantClass.HW);
}}

 

输出:super init 123,对于静态字段的访问只有直接定义这个字段的类才会被初始化,子类不会初始化,
把第一个注释取消后运行  ,并没有任何输出,通过数组定义引用类也不会触发类的初始化,但是会初始化一个由虚拟机自动生成继承自object类的子类的初始化,这个类代表了数组,数组的属性和方法都实现在这个类里(length属性和clone()),第二个注释取消后也不会有输出,常量在编译期间就会被放入常量池,ConstantClass.HW在编译期间就被放入NotInitialization类的常量池,NotInitialization并不会有NotInitialization的符号引用。

 

 
 
 
posted @ 2017-04-26 00:04  konami  阅读(1133)  评论(0编辑  收藏  举报