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