知乎很多人说创建子类对象并不会创建父类对象,调用父类的构造器也不是创建父类对象,只不过是调用父类的构造器来初始化属性。 而Thinking in Java第七章 初始化基类 是这样描述的:
由于现在涉及基类和导出类这两个类,而不是只有一个类,所以要试着想象导出类所产生的结果对象,会有点困惑。从外部看来,它就像是一个与基类具有相同接口的新类,或许还会有一些额外的方法和域。但继承并不只是复制基类的接口。当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。二者的区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部。 下面是我个人对这句话的理解:
子类对象包含了一个父类(基类)的子对象,而这个父类的子对象和直接new出来的是一样的。那么也就是说子类创建时父类也会被创建,只不过父类的对象被包含在子类中。 希望对这个了解比较深的大神们来指点一下,到底哪个说的对啊?
由于现在涉及基类和导出类这两个类,而不是只有一个类,所以要试着想象导出类所产生的结果对象,会有点困惑。从外部看来,它就像是一个与基类具有相同接口的新类,或许还会有一些额外的方法和域。但继承并不只是复制基类的接口。当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。二者的区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部。 下面是我个人对这句话的理解:
子类对象包含了一个父类(基类)的子对象,而这个父类的子对象和直接new出来的是一样的。那么也就是说子类创建时父类也会被创建,只不过父类的对象被包含在子类中。 希望对这个了解比较深的大神们来指点一下,到底哪个说的对啊?
extends 本来也不叫继承,叫扩展. 虽然说是父类,但是其实并不是父子关系, 只是在原有基础上增加自己的内容.(结果就是增加一些自己的特性,也覆盖一部分特性..)我觉得也许可以当做是一个大规模的语法糖.
当然我级别不够,不太好下这样的断言
对于您的问题,其实就相当于“A是B的儿子,那么A出生后B是不是就变成两个人了”,这显然是错误的。
子类对象实例,会继承父类的一些特征,但其本质上与父类是不同的。这可以针对面向对象的三大特性来进行分析:
我们都知道,面向对象的三大特性:继承,封装,多态。“子类与父类”的关系就是继承的体现,对于继承与多态而言,它只会影响类型的描述,而不会影响类型本身的分配。而封装就不一样了,如果把A当做属性传递给B,在B构建时对A进行创建,那么你创建B的时候就会创建A啦。
完善一下栗子:AB都是人,A是B的儿子,A有耳朵,B有耳朵。那么在B出生时,世界就多了一双耳朵,多了一个人。但是,你不能说B出生了,世界多了一个A呀,多了一种人呀(基因突变与残疾除外)
只能这么解释了,希望你能明白
Thinking in Java里的那段话该怎么解释为好?
你还是别举例子了,感觉你自己的思路都有点不清晰,你还是说说为啥Thinking in Java这么好的书里会有创建子类对象也就创建了父类对象这样的说法?
Thinking in Java里的那段话该怎么解释为好?不过我没看过Thinking in Java
这个子对象与你用基类直接创建的对象是一样的. 这句话比较诡异.. 其实并没有明说内存里面是一个对象还是两个对象的问题,应该是基于代码层面上的分析..当然如果你觉得知乎大神说的有问题,你也可以去知乎问一下呀