多平台统一管理软件接口,如何实现多平台统一管理软件接口
295
2022-11-27
Java类初始化时机测试方法解析
java 类加载的初始化过程中,编译器按语句在源文件中出现的顺序,依次自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生方法。 如果类中没有静态语句和静态代码块,那可以不生成
并且
准备父类和子类
class Father {
static int father_a = 1;
static {
System.out.println("父类静态代码块执行");
}
static class StaticInnerClass {
static {
System.out.println("静态内部类静态代码块执行");
}
}
}
class Son extends Father {
static {
System.out.println("子类静态代码块执行");
son_a = 300;
}
static int son_a = 100;
static final int M = 1;
}
Main方法:
1:父类没有被引用但是会被先加载
new Son();
2:反射也会产生主动引用:
Class a = Class.forName("clinit.Son");
(运行结果同1)
3:子类使用父类静态变量或方法不会产生类的引用
System.out.println("Father.a = " + Son.father_a);
4:通过类创建数组不会加载类(只是开辟一块空间)
Son[] sons = new Son[8];
5:使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)
System.out.println("Son.CONST = " + Son.CONST);
6:引用静态内部类不会加载外部类(应用于单例模式)
new Father.StaticInnerClass();
代码总结:
public static void main(String[] args) throws Exception {
// 1.父类没有被引用但是会被先加载
// new Son();
// 2.反射会产生主动引用
// Class a = Class.forName("clinit.Son");
// 3.子类使用父类静态变量或方法不会产生类的引用
// System.out.println("Father.a = " + Son.father_a);
// 4.通过类创建数组不会加载类(只是开辟一块空间)
// Son[] sons = new Son[8];
// 5.使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)
// System.out.println("Son.CONST = " + Son.CONST);
// 6.引用静态内部类不会加载外部类(应用于单例模式)
// new Son.StaticInneroewfgYbClass();
}
}
PS:由于是按出现的顺序执行的,为了避免不必要的麻烦,应尽量把静态变量写在静态代码块之前
public class Test {
public static void main(String[] args) {
System.out.println("a = " + cls.a);
}
}
class cls {
static int a = 10;8 static { a = 20; }9 }
如果 调换顺序输出结果将是 a = 10
class cls {
static { a = 20; }
oewfgYb static int a = 10;
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~