关于java类初始化的顺序
2015-01-26 19:51
92 查看
类的加载顺序
什么时候类加载
第一次需要使用类信息时加载。
类加载的原则:延迟加载,能不加载就不加载。
通过分析示例来讨论
示例1:
结果如下:
首先可以看到 两次创建实例(new aaa())却只执行了一次静态代码块中的内容
再看
示例2:
可以看到 没有创建对象也执行了静态代码块中的内容
得出结论:静态代码块在类编译的时候就执行 且只执行一次
先调用了执行了静态代码块中的内容
可以看出 最先加载了静态成员变量
再分析示例1:
因为静态代码块在编译时就已经执行 所以当new aaa()时先执行了构造代码块 然后在执行构造方法
示例3:
如图所示 类Test2继承了类aaa
现在来看创建子类示例过程中的初始化顺序:
可以看到 执行顺序:父类静态代码块 ->子类静态代码块->(创建子类示例:)父类构造代码块->子类构造代码块->父类构造器->子类构造代码块->子类构造器
通过debug方式(由于过程不好截图 就直接给出结论了) 得出结论:
综合上述 执行顺序为:查找父类->父类静态代码块->子类静态代码块->(创建子类示例)先找到子类的构造方法->执行子类构造方法中的super()方法(不显示 jvm默认添加)调用父类构造方法->父类构造代码块->父类构造器->子类构造代码块->子类构造器
-version1.1 2015.1.26
什么时候类加载
第一次需要使用类信息时加载。
类加载的原则:延迟加载,能不加载就不加载。
通过分析示例来讨论
示例1:
结果如下:
首先可以看到 两次创建实例(new aaa())却只执行了一次静态代码块中的内容
再看
示例2:
可以看到 没有创建对象也执行了静态代码块中的内容
得出结论:静态代码块在类编译的时候就执行 且只执行一次
先调用了执行了静态代码块中的内容
可以看出 最先加载了静态成员变量
再分析示例1:
因为静态代码块在编译时就已经执行 所以当new aaa()时先执行了构造代码块 然后在执行构造方法
示例3:
如图所示 类Test2继承了类aaa
现在来看创建子类示例过程中的初始化顺序:
可以看到 执行顺序:父类静态代码块 ->子类静态代码块->(创建子类示例:)父类构造代码块->子类构造代码块->父类构造器->子类构造代码块->子类构造器
通过debug方式(由于过程不好截图 就直接给出结论了) 得出结论:
综合上述 执行顺序为:查找父类->父类静态代码块->子类静态代码块->(创建子类示例)先找到子类的构造方法->执行子类构造方法中的super()方法(不显示 jvm默认添加)调用父类构造方法->父类构造代码块->父类构造器->子类构造代码块->子类构造器
-version1.1 2015.1.26
相关文章推荐
- 关于java类初始化顺序的学习笔记
- 转!!关于java类初始化顺序
- 测试一下关于类初始化顺序的知识~
- Java类及对象初始化的顺序
- 关于非静态类的静态成员与非静态成员的初始化顺序(zhuang)
- Java类的初始化顺序
- 关于java的初始化顺序
- 关于类成员的初始化顺序问题
- java类中静态域、块,非静态域、块,构造函数的初始化顺序(回钦波)
- java类的初始化顺序
- Java类初始化顺序
- 关于JAVA Static的初始化顺序(及递归错误)
- 一道关于静态变量的初始化顺序面试题
- Java类的初始化顺序
- 关于类继承/初始化成员变量/构造函数/析构函数 执行顺序
- 关于Page,Master,UserControl的初始化及加载顺序
- 关于static的初始化顺序
- Java类的初始化顺序
- Java类的初始化顺序
- 关于spring加载applicationContext初始化bean顺序的问题