Java 继承-为什么超类继承子类实例?

Java 继承-为什么超类继承子类实例?,java,inheritance,Java,Inheritance,假设有五个类是这样创建的: 如图所示,它们都是通过遗传联系在一起的,newFruit是GoldenDelicious的一个实例,myOrange是Orange的一个实例 以下是我的问题: 为什么newFruit是苹果和水果的一个例子,而不是Macintosh 为什么myOrange是水果而不是苹果的一个例子 根据我对继承的理解,苹果的所有子类(GoldenDelicious和Macintosh)都有它的实例,但苹果的超类(Fruit)没有。为什么不是这样?(不考虑接口以保持简单;只讨论类继承)

假设有五个类是这样创建的:

如图所示,它们都是通过遗传联系在一起的,newFruit是GoldenDelicious的一个实例,myOrange是Orange的一个实例

以下是我的问题:

  • 为什么newFruit是苹果和水果的一个例子,而不是Macintosh
  • 为什么myOrange是水果而不是苹果的一个例子
  • 根据我对继承的理解,苹果的所有子类(GoldenDelicious和Macintosh)都有它的实例,但苹果的超类(Fruit)没有。为什么不是这样?

    (不考虑接口以保持简单;只讨论类继承)

    如果您有一个如图所示的继承树, 然后,类的实例也将是所有父节点的实例,而不是同级节点的实例

    因为Java中的继承是一个复杂的过程

    在现实世界中,如果
    newFruit
    是一种
    GoldenDelicious
    ,那么它是一种苹果,也是一种水果。但是
    GoldenDelicious
    对象不是
    橙色
    。这似乎很直观。

    (不考虑接口以保持简单;只讨论类继承)

    如果您有一个如图所示的继承树, 然后,类的实例也将是所有父节点的实例,而不是同级节点的实例

    因为Java中的继承是一个复杂的过程


    在现实世界中,如果
    newFruit
    是一种
    GoldenDelicious
    ,那么它是一种苹果,也是一种水果。但是
    GoldenDelicious
    对象不是
    橙色
    。这看起来很直观。

    你正倒立着看这棵树。认真地试着在底部画上“水果”,看看它是否对你更有意义。同样的原因,我(newFruit)是人类(GoldenDelicious)和灵长类(Apple)的例子,但不是黑猩猩(Macintosh)。2.因为鸟(橙色)和灵长类动物(苹果)都是动物(水果),但鸟不是灵长类动物。你看树的时候是倒置的。认真地试着在底部画上“水果”,看看它是否对你更有意义。同样的原因,我(newFruit)是人类(GoldenDelicious)和灵长类(Apple)的例子,但不是黑猩猩(Macintosh)。2.因为鸟(橙色)和灵长类动物(苹果)都是动物(水果),但鸟不是灵长类动物。我被教导所有的子类都有来自超类的所有东西,包括实例(公共的),甚至更多。由于newFruit是在GoldenDelicious中创建的,所以GoldenDelicious的所有潜在子类都有newFruit,这是可以理解的。我现在想知道的是,为什么子类中创建的东西会传递回超类,我理解“是”关系,GoldenDelicious“是”苹果,但这如何等同于将实例从GoldenDelicious传递回苹果?
    newFruit
    GoldenDelicious
    的一个实例,它依次是一个
    苹果
    ,它依次是一个
    水果
    。因此,
    newFruit
    具有由
    GoldenDelicious
    定义的所有属性和方法(我们称之为“行为”)
    GoldenDelicious
    可以定义自己的行为,还继承了
    Apple
    的行为和
    Fruit
    的行为。总之,
    newFruit
    具有
    GoldenDelicious
    Apple
    Fruit
    中定义的所有属性和方法。但是,如果将
    GoldenDelicious
    的实例分配给
    Apple
    类型的变量,即
    Apple-Apple=new GoldenDelicious()
    那么它仍然是
    GoldenDelicious
    及其所有附加属性/方法的实例(与
    Apple
    相比)。但是您将无法通过此变量访问这些附加属性/方法。您需要这样做:
    ((GoldenDelicious)apple).methodOfGolderDelicious()
    。我被教导所有子类都有来自超类的所有内容,包括实例(公共的),甚至更多。由于newFruit是在GoldenDelicious中创建的,所以GoldenDelicious的所有潜在子类都有newFruit,这是可以理解的。我现在想知道的是,为什么子类中创建的东西会传递回超类,我理解“是”关系,GoldenDelicious“是”苹果,但这如何等同于将实例从GoldenDelicious传递回苹果?
    newFruit
    GoldenDelicious
    的一个实例,它依次是一个
    苹果
    ,它依次是一个
    水果
    。因此,
    newFruit
    具有由
    GoldenDelicious
    定义的所有属性和方法(我们称之为“行为”)
    GoldenDelicious
    可以定义自己的行为,还继承了
    Apple
    的行为和
    Fruit
    的行为。总之,
    newFruit
    具有
    GoldenDelicious
    Apple
    Fruit
    中定义的所有属性和方法。但是,如果将
    GoldenDelicious
    的实例分配给
    Apple
    类型的变量,即
    Apple-Apple=new GoldenDelicious()
    那么它仍然是
    GoldenDelicious
    及其所有附加属性/方法的实例(与
    Apple
    相比)。但是您将无法通过此变量访问这些附加属性/方法。您需要这样做:
    ((GoldenDelicious)apple.methodOfGolderDelicious()