关于继承关系的概念性问题?

时间:2011-02-26 20:01:05

标签: java inheritance relationship

这是我想要解决的作业问题:

  

R-2.9考虑继承   来自练习R-2.5的课程,让d   是Horse类型的对象变量。   如果d指的是实际的对象   类型马术,它可以铸造到   班级赛车?为什么或为什么不呢?

这是练习R-2.5:

  

R-2.5绘制一个类继承图   对于以下一组课程:

     

•Class Goat扩展了Object并添加了一个实例变量tail和   方法milk()和jump()。

     

•Class Pig扩展了Object并添加了一个实例变量nose和   方法eat()和wallow()。

     

•Class Horse扩展Object并添加实例变量height和   颜色和方法run()和jump()。

     

•Class Racer扩展Horse并添加方法race()。

     

•Equestrian类扩展了Horse并添加了一个实例变量   重量和方法小跑()和   isTrained()。

2 个答案:

答案 0 :(得分:4)

至于“马术能被投射到赛车手上吗?”部分问题:尝试实际实现所描述的类,并编写执行此类转换的代码。它编译?如果是这样,它在运行时会抛出异常吗?

至于“为什么?” part:如果B类扩展了A类,这意味着任何B也是A。这是Java知道这些类代表什么或我们打算如何使用它们的唯一方法--Java只知道每个Racer都是一匹马而且每个马术也是一匹马(而Java只知道这一点,因为我们在宣布课程时就这么说了)。基于这些信息,Java应该允许你采取马术(这可以做所有马匹可以做的东西,以及一些马术特定的东西,如小跑)是合理的,并开始像对待赛车一样对待它(这也可以做所有马可以做的事情,但不一定小跑,可以做一些Equestrians不能做的事情)?

另外,请注意编译器允许的内容与尝试时实际播放的内容之间存在差异。通常,编译器将允许可能成功的强制转换。尝试每个代码段;它们中的每一个都应该给出不同的结果(一个不会编译,一个会编译,但会在运行时抛出一个异常,一个将编译并运行,没有异常)。然后,反思为什么Java被设计为以这种方式运行。

// Code segment A
Horse h = new Equestrian();
Goat g = (Goat)h;

// Code segment B
Horse h = new Equestrian();
Racer r = (Racer)h;

// Code segment C
Horse h = new Racer();
Racer r = (Racer)h;

答案 1 :(得分:0)

将此视为一棵树:

马 - >马术

马 - >赛车

马术和赛马是主干马的两个分支。

继承仅适用于从上到下(从主干到分支)。子类的方法和变量可以由子类继承。因此,马术继承了马类的方法和变量。 Racer还继承了Horse类的方法和变量。但是,Racer或Equestrian类的对象不会继承彼此的方法或变量。

以上内容应该足以让您找到答案。完成作业后here's,您可以在其中找到更多信息。在早期就尽可能多地阅读这方面的基本概念非常重要。