New一个子类对象的时候是否创建了父类的对象

1 篇文章 0 订阅

首先:很坚决的说没有创建父类的对象!!!

1.首先从子类到直接父类,依次执行父类的构造方法(没有显示调用构造方法的情况下),这个过程执行父类成员的初始化。
我仔细把书上继承那章又读了好几遍!!!书上说的很明确,“创键子类的对象的时候,会先调用父类的构造函数!会先调用父类构造函数!会先调用父类的构造函数!”(重要的事情说三遍)!!并没有说会创建父类的对象,没说!!!!书上其实写的很微妙!应该直接指明这一点,防止学生误解!

2.最后调用本类的构造方法。

以上两步的结果是创建了本类对象,这个对象如图:
这里写图片描述

从图中可知,压根没有父类对象,只有子类对象,而且this完全引用这个对象,super只是引用了这个对象中从父类继承来的成员,也就是说,除了super不能访问子类定义的成员之外,super和this是同一个对象,这可以通过toString()方法验证(如果子类没有重写toString()方法,则调用父类的该方法,如果父类没有,再找父类的父类,直到Object的toString()方法)。

Object类toString方法:

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

getClass 和 getName 都是Object类的方法。

总之,没有super这个对象,他只是引用了子类对象的一部分数据(也就是从父类继承到的数据),所有无法输出super。那么为什么能输出super.toString()呢,原因在前面图中,这个调用过程是先试图调用从子类对象的直接父类继承的toString方法(注意:super.toString()是显式调用),如果没有则向上追述知道Object。

此处有个讨论大家可以去看看:http://bbs.csdn.net/topics/390836899

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值