`

创建子类的对象时也要创建其所有父类的对象?

 
阅读更多
这样一个例子:
class Animal
{
Animal()
{
System.out.println("Animal's constructor");
}
}
class Mankind extends Animal
{
Mankind()
{
System.out.println("Mankind's constructor");
}
}
public class Kids extends Mankind
{
Kids()
{
System.out.println("Kids' constructor");
}
public static void main(String[] args)
{
Kids someKid=new Kids();
}
}
为什么运行结果是:Animal's constructor
Mankind's constructor
Kids' constructor
难道在创建Kids的实例对象的时候,还调用了Kids的父类Animal和Mankind的构造方法 ?
那是不是也创建了Animal和Mankind的对象,只不过因为没有引用指向它们所以又被java的
“垃圾自动回收”机制回收了???没有,在创建一个子类对象时,并不创建对象,创建对象是要用new的啊。子类的构造器先调用父类的无参数父类构造器,除非你在构造器中显示调用了父类的某个构造器。调用构造函数的意义:
子类继承父类,一种是把父类属性继承下来,然后调用父类的构造函数来初始化这些属性,直致所有这些继承下来属性都初始化完毕(即所有父类的构造函数都被调用),这样解释的话,当然不会构造父类对象! 因为这些构造函数的调用是为了初始化从父类继承下来的属性,被初始化的属性 的地址始终在本对象当中,虽然会出现 象 构造父类对象的现象,但那只是子类实例化的一个过程,并非实际上生成父类对象。
打个比喻,或许你更能明白: 人类出生之前的十个月,会出现象哺乳动物的特征(胎儿在一个月时最象,到第十个月时,就完全是人了),你不能说,在形成人的过程当中,就要先生出一个哺乳动物,然后再生出一个人吧。
希望你能明白这个比喻! Thinking in Java 第六章中说得很明白:
创建衍生类的一个对象时,它在其中包含了基础类的一个“子对象”。这个子对象就象我们根据基础类本身创建了它的一个对象。从外部看,基础类的子对象已封装到衍生类的对象里了。
当然,基础类子对象应该正确地初始化,而且只有一种方法能保证这一点:在构建器中执行初始化,通过调用基础类构建器,后者有足够的能力和权限来执行对基础类的初始化。在衍生类的构建器中,Java会自动插入对基础类构建器的调用。下面这个例子向大家展示了对这种三级继承的应用:

//: Cartoon.java
// Constructor calls during inheritance

class Art {
Art() {
System.out.println("Art constructor");
}
}

class Drawing extends Art {
Drawing() {
System.out.println("Drawing constructor");
}
}

public class Cartoon extends Drawing {
Cartoon() {
System.out.println("Cartoon constructor");
}
public static void main(String[] args) {
Cartoon x = new Cartoon();
}
} ///:~

该程序的输出显示了自动调用:

Art constructor
Drawing constructor
Cartoon constructor

可以看出,构建是在基础类的“外部”进行的,所以基础类会在衍生类访问它之前得到正确的初始化。
即使没有为Cartoon()创建一个构建器,编译器也会为我们自动合成一个默认构建器,并发出对基础类构建器的调用
分享到:
评论
1 楼 zxs6587 2014-11-07  
Thinking inJava我读着好像说要建立基类对象啊!请大神为我指点迷津吧!

相关推荐

Global site tag (gtag.js) - Google Analytics