创建子类对象时会不会创建父类对象

欧洋666 2017-03-17 03:15:49
知乎很多人说创建子类对象并不会创建父类对象,调用父类的构造器也不是创建父类对象,只不过是调用父类的构造器来初始化属性。

而Thinking in Java第七章 初始化基类 是这样描述的:
由于现在涉及基类和导出类这两个类,而不是只有一个类,所以要试着想象导出类所产生的结果对象,会有点困惑。从外部看来,它就像是一个与基类具有相同接口的新类,或许还会有一些额外的方法和域。但继承并不只是复制基类的接口。当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。二者的区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部。

下面是我个人对这句话的理解:
子类对象包含了一个父类(基类)的子对象,而这个父类的子对象和直接new出来的是一样的。那么也就是说子类创建时父类也会被创建,只不过父类的对象被包含在子类中。

希望对这个了解比较深的大神们来指点一下,到底哪个说的对啊?
...全文
793 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
逗泥丸的平方 2017-03-20
  • 打赏
  • 举报
回复
引用 3 楼 u010660066 的回复:
[quote=引用 1 楼 qq_35209952 的回复:] 没有父类对象这个概念. extends 本来也不叫继承,叫扩展. 虽然说是父类,但是其实并不是父子关系, 只是在原有基础上增加自己的内容.(结果就是增加一些自己的特性,也覆盖一部分特性..) 我觉得也许可以当做是一个大规模的语法糖. 当然我级别不够,不太好下这样的断言
Thinking in Java里的那段话该怎么解释为好? [/quote] 不过我没看过Thinking in Java 这个子对象与你用基类直接创建的对象是一样的. 这句话比较诡异.. 其实并没有明说内存里面是一个对象还是两个对象的问题,应该是基于代码层面上的分析.. 当然如果你觉得知乎大神说的有问题,你也可以去知乎问一下呀
zs808 2017-03-17
  • 打赏
  • 举报
回复
首先,对象与类之间的关系需要分来来谈。 对于您的问题,其实就相当于“A是B的儿子,那么A出生后B是不是就变成两个人了”,这显然是错误的。 子类对象实例,会继承父类的一些特征,但其本质上与父类是不同的。这可以针对面向对象的三大特性来进行分析: 我们都知道,面向对象的三大特性:继承,封装,多态。“子类与父类”的关系就是继承的体现,对于继承与多态而言,它只会影响类型的描述,而不会影响类型本身的分配。而封装就不一样了,如果把A当做属性传递给B,在B构建时对A进行创建,那么你创建B的时候就会创建A啦。 完善一下栗子:AB都是人,A是B的儿子,A有耳朵,B有耳朵。那么在B出生时,世界就多了一双耳朵,多了一个人。但是,你不能说B出生了,世界多了一个A呀,多了一种人呀(基因突变与残疾除外)。。。 只能这么解释了,希望你能明白
逗泥丸的平方 2017-03-17
  • 打赏
  • 举报
回复
没有父类对象这个概念. extends 本来也不叫继承,叫扩展. 虽然说是父类,但是其实并不是父子关系, 只是在原有基础上增加自己的内容.(结果就是增加一些自己的特性,也覆盖一部分特性..) 我觉得也许可以当做是一个大规模的语法糖. 当然我级别不够,不太好下这样的断言
李德胜1995 2017-03-17
  • 打赏
  • 举报
回复
看字节码指令只创建了子类。。。。
zs808 2017-03-17
  • 打赏
  • 举报
回复
至于知乎的理解与你的理解不同,只是站的角度不一样罢了。类型A完全的嵌入到了类型B中,那么你还可以说A是存在的吗?这显然与常规理解不一样。再举个例子,就是一滴水,低到了一杯水里,那么你还能说这个谁存在吗?但是,说这杯水里包含这滴水,是没有问题的。
qq_37951711 2017-03-17
  • 打赏
  • 举报
回复
创建子类对象时会先调用父类构造器然后调用子类构造器
欧洋666 2017-03-17
  • 打赏
  • 举报
回复
引用 2 楼 zs808 的回复:
首先,对象与类之间的关系需要分来来谈。 对于您的问题,其实就相当于“A是B的儿子,那么A出生后B是不是就变成两个人了”,这显然是错误的。 子类对象实例,会继承父类的一些特征,但其本质上与父类是不同的。这可以针对面向对象的三大特性来进行分析: 我们都知道,面向对象的三大特性:继承,封装,多态。“子类与父类”的关系就是继承的体现,对于继承与多态而言,它只会影响类型的描述,而不会影响类型本身的分配。而封装就不一样了,如果把A当做属性传递给B,在B构建时对A进行创建,那么你创建B的时候就会创建A啦。 完善一下栗子:AB都是人,A是B的儿子,A有耳朵,B有耳朵。那么在B出生时,世界就多了一双耳朵,多了一个人。但是,你不能说B出生了,世界多了一个A呀,多了一种人呀(基因突变与残疾除外)。。。 只能这么解释了,希望你能明白
你还是别举例子了,感觉你自己的思路都有点不清晰,你还是说说为啥Thinking in Java这么好的书里会有创建子类对象也就创建了父类对象这样的说法?
欧洋666 2017-03-17
  • 打赏
  • 举报
回复
引用 1 楼 qq_35209952 的回复:
没有父类对象这个概念. extends 本来也不叫继承,叫扩展. 虽然说是父类,但是其实并不是父子关系, 只是在原有基础上增加自己的内容.(结果就是增加一些自己的特性,也覆盖一部分特性..) 我觉得也许可以当做是一个大规模的语法糖. 当然我级别不够,不太好下这样的断言
Thinking in Java里的那段话该怎么解释为好?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧