黑马程序员技术交流社区

标题: new子类的时候是否new了父类的实例对象? [打印本页]

作者: 程金    时间: 2012-9-19 18:54
标题: new子类的时候是否new了父类的实例对象?
本帖最后由 程金 于 2012-9-20 15:41 编辑

百度了一下没找到统一答案,
说没有吧,但是new子类的时候,调用了父类的构造器,调用了构造器难道不是new父类实例对象?有什么区别?而且有父类的引用,可以调用父类方法的变量
说有吧,如果new了所有父类的实例对象的话,那不是很占内存和浪费时间吗
作者: 张 涛    时间: 2012-9-19 19:09
new了,从内存分析。一个animal是父类,一个dog是子类。new出dog后,其对象在堆内存中。如图:大方块是子类dog对象在内存中的存在形式,小方块是父类animal在内存中的存在形式。

也就是new出子类后,从父类继承来的对象属性是存在父类对象中的,父类引用是super。
作者: 史小兵    时间: 2012-9-19 19:27
这应该是多态上的问题!
java引用类型变量通常来讲会分为两种,一种是编译时的类型,另一种就是运行时的类型。编译时类型由声明该变量时的类型决定,运行时的类型由实际赋给该变量的类型决定。如果两者不一致就会出现多态!
其实呢子类就是一个特殊的父类(每次调用时时产生了父类对象就是他自己),因此java中才可以把一个子类对象直接的赋给一个父类的引用变量,不需要进行任何类型之间的转换!
作者: 冯心程    时间: 2012-9-19 20:48
子类的构造函数在进行对象初始化时都会默认访问父类中的空参数构造函数
子类继承了父类后,存储了父类中的属性,必须要先看父类是如何对自己的属性进行初始化的
如果父类中没有提供空参数构造函数,子类的构造函数中必须通过super语句明确调用父类中的指定构造函数
初始化的动作要先完成,尤其是父类的初始化,所以如你所说会先访问下父类,如若不是这样 那么子类根本就无法得之自己继承了哪些方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2