知乎很多人说创建子类对象并不会创建父类对象,调用父类的构造器也不是创建父类对象,只不过是调用父类的构造器来初始化属性。 而Thinking in Java第七章 初始化基类 是这样描述的:
  由于现在涉及基类和导出类这两个类,而不是只有一个类,所以要试着想象导出类所产生的结果对象,会有点困惑。从外部看来,它就像是一个与基类具有相同接口的新类,或许还会有一些额外的方法和域。但继承并不只是复制基类的接口。当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。二者的区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部。  下面是我个人对这句话的理解:
  子类对象包含了一个父类(基类)的子对象,而这个父类的子对象和直接new出来的是一样的。那么也就是说子类创建时父类也会被创建,只不过父类的对象被包含在子类中。  希望对这个了解比较深的大神们来指点一下,到底哪个说的对啊?

解决方案 »

  1.   

    没有父类对象这个概念.
    extends 本来也不叫继承,叫扩展. 虽然说是父类,但是其实并不是父子关系, 只是在原有基础上增加自己的内容.(结果就是增加一些自己的特性,也覆盖一部分特性..)我觉得也许可以当做是一个大规模的语法糖.
    当然我级别不够,不太好下这样的断言
      

  2.   

    首先,对象与类之间的关系需要分来来谈。
    对于您的问题,其实就相当于“A是B的儿子,那么A出生后B是不是就变成两个人了”,这显然是错误的。
    子类对象实例,会继承父类的一些特征,但其本质上与父类是不同的。这可以针对面向对象的三大特性来进行分析:
    我们都知道,面向对象的三大特性:继承,封装,多态。“子类与父类”的关系就是继承的体现,对于继承与多态而言,它只会影响类型的描述,而不会影响类型本身的分配。而封装就不一样了,如果把A当做属性传递给B,在B构建时对A进行创建,那么你创建B的时候就会创建A啦。
    完善一下栗子:AB都是人,A是B的儿子,A有耳朵,B有耳朵。那么在B出生时,世界就多了一双耳朵,多了一个人。但是,你不能说B出生了,世界多了一个A呀,多了一种人呀(基因突变与残疾除外)
    只能这么解释了,希望你能明白
      

  3.   


    Thinking in Java里的那段话该怎么解释为好?
      

  4.   


    你还是别举例子了,感觉你自己的思路都有点不清晰,你还是说说为啥Thinking in Java这么好的书里会有创建子类对象也就创建了父类对象这样的说法?
      

  5.   

    至于知乎的理解与你的理解不同,只是站的角度不一样罢了。类型A完全的嵌入到了类型B中,那么你还可以说A是存在的吗?这显然与常规理解不一样。再举个例子,就是一滴水,低到了一杯水里,那么你还能说这个谁存在吗?但是,说这杯水里包含这滴水,是没有问题的。
      

  6.   


    Thinking in Java里的那段话该怎么解释为好?不过我没看过Thinking in Java
    这个子对象与你用基类直接创建的对象是一样的.  这句话比较诡异.. 其实并没有明说内存里面是一个对象还是两个对象的问题,应该是基于代码层面上的分析..当然如果你觉得知乎大神说的有问题,你也可以去知乎问一下呀