继承中父类的初始化方式

p144页有感

一、提出问题

假设有一些类,这些类有继承关系的时候,当初始化一个子类对象,对于该类的父类而言,发生了什么呢?是仅仅只是复制了一个引用还是也会同时new一个父类对象呢?

二、解释问题

由于涉及到子类和父类之间的关系,从外部看,似乎子类拥有与父类相同的接口,而且可包含一些额外的方法和字段。但继承并非仅仅简单地复制父类的接口了事。创建子类的一个对象时,它在其中包含了父类的一个“对
象”。这个对象就象我们根据父类本身创建了它的一个对象。从外部看,父类的对象已封装到子类的对象里了。当然,父类对象应该正确地初始化,而且只有一种方法能保证这一点:在构建器中执行初始化,通过调用父类构建器,后者有足够的能力和权限来执行对父类的初始化。在子类的构建器中,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) {
 Cartoon x = new Cartoon();
     }
} 

输出:

Art 构造器
Drawing 构造器
Cartoon 构造器

可以看出,构建是在基础类的“外部”进行的,所以基础类会在衍生类访问它之前得到正确的初始化。
即使没有为 Cartoon()创建一个构建器,编译器也会为我们自动合成一个默认构建器,并发出对基础类构建
器的调用,并且顺序是从最爷爷类-父类-子类 这样的顺序来进行的,与上一篇文章中的类初始化顺序对应。

版权声明:本文为blackmlik原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/blackmlik/p/12360215.html