java类的加载以及初始化顺序
来源:互联网 发布:网络教育和开放教育 编辑:程序博客网 时间:2024/05/29 18:54
类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题。从网上查阅了若干文章,现总结如下:
1. 没有继承的情况
单独一个类的场景下,初始化顺序为依次为 静态数据,继承的基类的构造函数,成员变量,被调用的构造函数。
其中静态数据只会初始化一次。
public class App2 { public static void main(String[] args) { Son son = new Son(); }}class Son { public Son() { System.out.println("this is son."); } public Son(int age) { System.out.println("son is " + age + " years old."); } private Height height = new Height(1.8f); public static Gender gender = new Gender(true);}class Height { public Height(float height) { System.out.println("initializing height " + height + " meters."); }}class Gender { public Gender(boolean isMale) { if (isMale) { System.out.println("this is a male."); } else { System.out.println("this is a female."); } }}
输出:
2. 继承的情况
稍微修改一下代码,添加两个基类,让Son继承Father, Father继承Grandpa。
继承的情况就比较复杂了。由于继承了基类,还将往上回溯,递归地调用基类的无参构造方法。
在我们的例子中,在初始化静态数据后,会先往上追溯,调用Father的默认构造方法,此时再往上追溯到Grandpa的默认构造方法。
注:如果在子类的构造方法中,显式地调用了父类的带参构造方法,那么JVM将调用指定的构造方法而非默认构造方法。
我们继续修改代码,让其最终呈现如下:public class App2 { public static void main(String[] args) { Son son = new Son(); }}class Grandpa { public Grandpa() { System.out.println("this is grandpa."); } public Grandpa(int age) { System.out.println("grandpa is " + age + " years old."); } private Height height = new Height(1.5f); public static Gender gender = new Gender(true, "grandpa");}class Father extends Grandpa { public Father() { System.out.println("this is father."); } public Father(int age) { System.out.println("father is " + age + " years old."); } private Height height = new Height(1.6f); public static Gender gender = new Gender(true, "father");}class Son extends Father { public Son() { super(50); System.out.println("this is son."); } public Son(int age) { System.out.println("son is " + age + " years old."); } private Height height = new Height(1.8f); public static Gender gender = new Gender(true, "son");}class Height { public Height(float height) { System.out.println("initializing height " + height + " meters."); }}class Gender { public Gender(boolean isMale) { if (isMale) { System.out.println("this is a male."); } else { System.out.println("this is a female."); } } public Gender(boolean isMale, String identify) { if (isMale) { System.out.println(identify + " is a male."); } else { System.out.println(identify + " is a female."); } }}
最后输出会是什么呢?
参考下面另一个案例的分析。链接:http://bbs.csdn.net/topics/310164953
在我们的示例中,加载顺序应该是这样的:
Grandpa 静态数据
Father 静态数据
Son 静态数据
Grandpa 成员变量
Grandpa 构造方法
Father 成员变量
Father 构造方法
Son 成员变量
Son 构造方法
所以输出如下:
1 0
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序&&阿里真题
- 类的加载顺序以及静态成员初始化顺序
- Java类的加载及初始化顺序
- java初始化的加载顺序
- java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序如下:
- java 类加载-初始化顺序
- 类的加载,初始化顺序
- Java类的加载和初始化顺序分析
- JAVA类在初始化时成员的加载顺序
- Java类的加载和初始化顺序分析
- 配置XML自动提示,以Struts2.xml为例(收集)
- javaWeb项目打包成war,发布在tomcat
- 解决MyEclipse Trial Expired
- css 动画总结
- java 语言 关键字 instanceof
- java类的加载以及初始化顺序
- Android L限制Ripple水波纹范围大小
- UE4蓝图控制一个物体的移动
- K-means算法
- 找到数组中每项的最大值并返回一个新的数组
- linux更新tomcat下的项目命令(自己记录)
- CWDM/DWDM复用/解复用器简介
- 标准盒子模型和IE盒子模型
- 牛腩(9)-.NET使用一般处理程序生成验证码!