`

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

 
阅读更多
这样一个例子:
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我读着好像说要建立基类对象啊!请大神为我指点迷津吧!

相关推荐

    java 子类对象赋值给父类对象的使用

    当我们创建一个子类对象并将其赋值给父类引用时,这种行为被称为向上转型(Upcasting)。这一过程是自动且安全的,因为子类对象包含了父类的所有属性和方法。下面我们将深入探讨这个主题,包括它的原理、示例代码...

    父类引用指向子类对象

    ### 父类引用指向子类对象 在面向对象编程中,“父类引用指向子类对象”是一个重要的概念,尤其在Java等支持继承的语言中应用广泛。这一机制允许使用父类类型的引用变量来引用子类的对象,从而实现多态性。 #### ...

    父类赋值给子类

    可以利用序列化将父类对象转换为字节数组,然后将这个字节数组反序列化为子类对象。这种方法适用于复杂的对象结构,但效率较低,且需要实现 `ISerializable` 接口。 4. **属性映射**: 使用辅助工具(如 ...

    将子类引用赋给父类对象时,java虚拟主机并没有将那些非继承成员丢弃

    在Java编程语言中,"将子类引用赋给父类对象"是一种常见的多态性表现。这个过程被称为向上转型(Upcasting),它允许我们用父类引用指向子类实例,从而实现更通用的代码设计。然而,这并不意味着在转换过程中会丢失...

    在父类获取子类属性

    1. **直接访问**:如果子类的属性是public或protected的,那么在同一个包内的其他类或者子类自身,都可以直接通过子类对象来访问这些属性。 2. **super关键字**:在子类中,可以通过`super`关键字来访问父类的属性和...

    java反射获取所有属性,获取所有get方法,包括子类父类

    在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细...

    子类对象构建调用父类的构造方法

    程序中描述了子类对象构建调用父类的构造方法,以及类变量和实例变量创建的不同过程

    论JAVA继承机制中父类与子类的关系

    - 当创建子类对象时,子类的构造器会隐式调用父类的无参构造器。如果父类没有无参构造器,则必须在子类构造器中显式调用父类构造器,通常使用`super(参数列表);`。 - 如果子类中定义了与父类同名的成员变量,父类的...

    子类调用抽象父类.zip

    4. **多态性**:子类对象可以被视为父类对象,调用父类公共方法。 5. **重写**:子类可以覆盖父类的抽象方法和属性。 6. **子类属性与方法**:子类可以有自己的属性和方法,也可以调用父类方法。 7. **构造函数调用*...

    JS在子类中用Object.getPrototypeOf去调用父类方法

    当我们谈论子类与父类(也称为基类)的关系时,继承机制允许子类继承父类的属性和方法。在某些情况下,我们需要在子类中调用父类的方法,以便于扩展或覆盖原有功能。这里我们将深入探讨如何使用`Object....

    Java面向对象(进阶)- super关键字的使用与子类对象实例化全过程

    这是因为Java在创建子类对象时,会先确保父类的初始化工作完成。这个过程可以通过在子类构造器中使用`super(参数列表)`来显式调用父类构造器。 总结,`super`关键字在Java面向对象编程中起到了关键的作用,它帮助...

    父类引用指向子类对象[归纳].pdf

    在这种情况下,"父类引用指向子类对象"即为多态的一种体现,也被称为向上转型(Upcasting)。例如,如果我们有一个Animal类作为父类,Cat和Dog作为子类,可以声明一个Animal类型的引用并将其指向Cat或Dog实例: ```...

    Python子类继承父类构造函数详解

    如果子类没有定义自己的构造函数(即没有定义`__init__`方法),那么在实例化子类时,Python会自动调用父类的构造函数来初始化对象。例如: ```python class Son(Father): def getName(self): return 'Son' + ...

    再次详细说明在继承中的程序执行顺序,子类与父类到底哪个先执行

    - 静态初始化块在类加载时执行,而不是在对象创建时。这意味着无论创建多少个子类对象,静态初始化块只执行一次。父类的静态初始化块会先于子类的执行。 5. **实例初始化块**: - 实例初始化块在创建对象时执行,...

    java多态性详解——父类引用子类对象.pdf

    Java 多态性详解 —— 父类引用子类对象 多态性是 Java 面向对象编程的三个特征之一,另外两个是封装和继承。多态性是指通过方法的重写、重载和动态连接来实现的。在 Java 中,多态性是为了解决单继承问题而引入的...

    浅谈java继承中是否创建父类对象

    但是,一个常见的问题是, Java 中的继承是否创建父类对象?在这篇文章中,我们将深入探讨这个问题,并提供详细的解释和示例。 首先,让我们来探讨一下 Java 中的继承机制。在 Java 中,子类可以继承父类的属性和...

    java中的继承(子类调用父类构造方法还不懂).doc

    继承允许创建一个新的类(称为子类或派生类),该类继承了现有类(称为父类或基类)的所有属性和行为。通过继承,子类不仅可以重用父类的功能,还可以扩展或覆盖父类的行为。 #### 二、子类如何调用父类构造方法 ...

    javase子类父类继承关系图解

    这个顺序可以通过“创建子类对象内存加载顺序.png”图更加直观地理解。图中可能会清晰地展示出每个阶段的内存分配和对象构造过程,帮助学习者形成视觉记忆,加深理解。 了解这些基础知识对于编写健壮的Java代码至关...

Global site tag (gtag.js) - Google Analytics