在Java编程语言中,类之间的继承关系涉及到一个重要的概念——初始化顺序。当创建一个子类对象时,不仅子类的实例变量会被初始化,其父类的实例变量也会按一定的顺序进行初始化。理解这个顺序对于编写复杂的多层继承系统至关重要,避免出现意外的行为。 我们来看一下给定代码的例子: ```java class Art { Art() { System.out.println("Art"); } } class Drawing extends Art { Drawing() { System.out.println("Drawing"); } } public class Cartoon extends Drawing { Cartoon() { System.out.println("Cartoon"); } public static void main(String[] args) { Art cartoon = new Cartoon(); } } ``` 在`main`方法中,我们创建了一个`Cartoon`对象,并将其赋值给`Art`类型的引用`cartoon`。这并不会导致类型转换错误,因为`Cartoon`类继承自`Drawing`,而`Drawing`又继承自`Art`。那么,当我们执行`new Cartoon()`时,初始化过程如下: 1. **静态初始化**:在任何对象创建之前,会先执行类中的静态初始化块(如果有)。这里没有静态初始化块,所以我们可以跳过这一步。 2. **父类实例初始化**:由于`Cartoon`是`Drawing`的子类,所以在创建`Cartoon`对象时,会先初始化`Drawing`。`Drawing`类没有父类,所以它直接调用其构造器`Drawing()`,打印出"Drawing"。 3. **当前类实例初始化**:接着,`Drawing`构造器执行完毕后,会继续初始化`Cartoon`。`Cartoon`类的构造器调用`super()`(默认行为),这会调用`Drawing`的构造器。由于`Drawing`的构造器已经执行过,所以不会再次调用,而是直接进入`Cartoon`的构造器,打印出"Cartoon"。 4. **父类的非静态实例初始化**:在调用子类构造器之前,父类的实例变量会被初始化。在这个例子中,`Art`类的构造器`Art()`被调用,打印出"Art"。注意,这是在`Cartoon`的构造器开始执行之前发生的,即使`Art`的构造器在代码中位于`Drawing`和`Cartoon`之后。 5. **子类的非静态实例初始化**:现在,所有父类的初始化都已经完成,`Cartoon`的构造器可以安全地初始化自己的实例变量。在这个例子中,没有显示的实例变量初始化,但如果有,它们将在此阶段进行。 6. **构造器主体**:`Cartoon`构造器的主体部分被执行,这里是空的,所以没有额外的操作。 因此,输出结果是"Art"、"Drawing"、"Cartoon",按照父类到子类的顺序。这个顺序对于理解类的初始化过程非常重要,特别是在处理复杂的继承结构时,可能包含多个父类和多个子类的构造器,以及静态和非静态初始化块。确保理解这个顺序可以帮助避免潜在的运行时错误,例如,依赖于未初始化的父类成员变量。
































- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 大数据时代下互联网金融发展的机遇与风险应对.docx
- 三天六万平米之创造算量新神话.doc
- 信息化条件下农村综合服务体系建设问题与对策.docx
- 通信设备环境考点精讲之空调系统的水泵与冷却塔.docx
- 电子信息工程在信息化环境中的发展探讨.docx
- 建设工程施工技术资料管理培训课件(161页)2.pdf
- 实验一---网络化控制系统的构成及投运和1.doc
- 牛津英语3A优秀教案.doc
- 物流行业信息化发展现状及趋势分析.docx
- 基于android-的任务管理器的设计.doc
- 某小区工地临时用水方案.doc
- 互联网时代的信息技术.doc
- 11-楼竣工评估报告.doc
- 万科大钢模板施工方案.doc
- 消防水施工程进度计划安排表.doc
- 第11讲第6章-圆轴扭转-.ppt


