Java类初始化时机测试方法解析
Java类加载的初始化过程中,编译器按语句在源文件中出现的顺序,依次自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生方法。如果类中没有静态语句和静态代码块,那可以不生成
并且
准备父类和子类
classFather{ staticintfather_a=1; static{ System.out.println("父类静态代码块执行"); } staticclassStaticInnerClass{ static{ System.out.println("静态内部类静态代码块执行"); } } } classSonextendsFather{ static{ System.out.println("子类静态代码块执行"); son_a=300; } staticintson_a=100; staticfinalintM=1; }
Main方法:
1:父类没有被引用但是会被先加载
newSon();
2:反射也会产生主动引用:
Classa=Class.forName("clinit.Son");
(运行结果同1)
3:子类使用父类静态变量或方法不会产生类的引用
System.out.println("Father.a="+Son.father_a);
4:通过类创建数组不会加载类(只是开辟一块空间)
Son[]sons=newSon[8];
5:使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)
System.out.println("Son.CONST="+Son.CONST);
6:引用静态内部类不会加载外部类(应用于单例模式)
newFather.StaticInnerClass();
代码总结:
publicstaticvoidmain(String[]args)throwsException{ //1.父类没有被引用但是会被先加载 //newSon(); //2.反射会产生主动引用 //Classa=Class.forName("clinit.Son"); //3.子类使用父类静态变量或方法不会产生类的引用 //System.out.println("Father.a="+Son.father_a); //4.通过类创建数组不会加载类(只是开辟一块空间) //Son[]sons=newSon[8]; //5.使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了) //System.out.println("Son.CONST="+Son.CONST); //6.引用静态内部类不会加载外部类(应用于单例模式) //newSon.StaticInnerClass(); } }
PS:由于是按出现的顺序执行的,为了避免不必要的麻烦,应尽量把静态变量写在静态代码块之前
publicclassTest{ publicstaticvoidmain(String[]args){ System.out.println("a="+cls.a); } } classcls{ staticinta=10;8static{a=20;}9}
如果调换顺序输出结果将是a=10
classcls{ static{a=20;} staticinta=10; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。