一个以前没有注意的问题:java构造函数的执行顺序
来源:互联网 发布:美洽电脑软件下载 编辑:程序博客网 时间:2024/04/29 18:26
public class Son extends Father { SonProp r = new SonProp(); public Son() { System.out.println("Son is construct"); } public static void main(String[] args) { new Son(); }}class Father { FatherProp SonProp = new FatherProp(); public Father() { System.out.println("Father is construct"); }}class SonProp { public SonProp() { System.out.println("SonProp is construct"); }}class FatherProp { public FatherProp() { System.out.println("FatherProp is construct"); }}执行结果如下:
FatherProp is construct
Father is construct
SonProp is construct
Son is construct
由此不难看出java类初始化时构造函数调用顺序:
(1)初始化对象的存储空间为零或null值;
(2)按顺序分别调用父类成员变量和实例成员变量的初始化表达式;
(3)调用父类构造函数;(如果实用super()方法指定具体的某个父类构造函数则使用指定的那个父类构造函数)
(4)按顺序分别调用类成员变量和实例成员变量的初始化表达式;
(5)调用类本身构造函数。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 初始化分为为的初始化和实例的初始化
2. 每个类在 JVM 中都对应一个 Class 实例
3. 父类实例是作为子例的部分存在的 (Class 实例之间也存在父子关系)
4. 初始化实例之前要初始化类
基于以上几点就可以理解以下初始化顺序
1. 父类静态属性、静态类 (父类的初始化,对应 JVM 方法 cinit())
2. 子类的静态属性、静态类 (子类的初始化,对应 JVM 方法 cinit())
3. 父类的实例构造,实例变量初始化 (实例变量初始实际会放到 JVM 的 init() 中)
4. 子类的实例构造,实例变量初始化 (也是对应的 init() 方法)
关于类的 Class 实例,可以回想 Log 的声明
Log log = LogFactory.getLog(TestClass.class);
也就是无论你,new 多少个 TestClass 实例,它们对应着同一个 TestClass 的 Class 实例,也就是为什么很多地方把静态方法、静态属性说成是类的方法、类的属性,其实质就是在 JVM 中存在同一个 Class 实例的方法、属性,也就能保持一致性。
关于父类实例是作为子类的一部分存在,可借鉴 C++ 或是有面向对象特性的 C 函数库(如 gtk),来理解,父类实例会居于子类实例的首地址,所以对子类转型成父类实例时,它是安全的,因为首地址一样的,所以从首地址到 size(父类)就是父类实例地址空间,到size(子类)就是子类实例的地址空间。
- 一个以前没有注意的问题:java构造函数的执行顺序
- Java中构造函数执行顺序的问题
- Java中构造函数执行顺序的问题
- java静态代码块 构造代码块 构造方法的执行顺序及注意问题
- JAVA 继承 构造函数的执行顺序
- java构造函数的执行顺序
- JAVA 继承 构造函数的执行顺序
- 【java】构造函数的继承执行顺序
- Java中构造函数的执行顺序
- Java中构造函数、构造代码块、静态代码块等的执行顺序问题
- 构造函数的执行顺序
- 构造函数的执行顺序
- 构造函数的执行顺序
- 构造函数的执行顺序
- 构造函数的执行顺序
- :(~~ 痛苦啊~~构造了一个“没有执行能力”的函数
- :(~~ 痛苦啊~~构造了一个“没有执行能力”的函数
- java构造函数和初始化函数的执行顺序
- ACM 动态规划初步 Partitioning by Palindromes
- hdu 2013 蟠桃记
- Aho-Corasick算法
- POJ3071--Football
- libsvm-3.11(matlab)
- 一个以前没有注意的问题:java构造函数的执行顺序
- POI入门教程
- 花了两个小时做的-- 算不算久呢? 事件监听器 计算器java版 GUI
- 内排序Java实现
- POJ3140--Contestants Division
- hdu 4614 Vases and Flowers (线段树+二分)
- mahout 源码解析之聚类--聚类策略
- HDU--杭电--1114--Piggy-Bank--背包
- POJ 1113 Wall【凸包周长】