这是我想要解决的作业问题:
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()。
答案 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,您可以在其中找到更多信息。在早期就尽可能多地阅读这方面的基本概念非常重要。