[英]Inheritance and polymorphism problems
我有这个代码形式的SCJP书:
1. class Mammal {
2. String name = "furry ";
3. String makeNoise() { return "generic noise"; }
4. }
5.
6. class Zebra extends Mammal {
7. String name = "stripes ";
8. String makeNoise() { return "bray"; }
9. }
10.
11. public class ZooKeeper {
12. public static void main(String[] args) {
13. new ZooKeeper().go();
14. }
15.
16. void go() {
17. Mammal m = new Zebra();
18. System.out.println(m.name + m.makeNoise());
19. }
20. }
运行此代码的结果是“毛茸茸的bray”。
问题1
我不明白为什么第17行不是:Zebra zebra2 = new Zebra();
以下每种情况的目的是什么,何时使用哪种?
Mammal zebra1 = new Zebra();
VS
Zebra zebra2 = new Zebra();
问题2
为什么来自Zebra
类的变量name = "stripes"
被来自Mammal
类的name = "furry"
覆盖? 我希望反对:来自子类的变量将覆盖来自超类的变量。
答案1
Mammal zebra1 = new Zebra();
用于表示您可以将派生类的对象分配给父类的类型的变量。 这也是Mammal m
一个原因,因为你也可以拥有一个源自Mammal的Lion
类并将它分配给m
。 m
可以容纳Mammal
类或任何来自Mammal
类。
答案2
这也与继承有关。 当你打印m.name
,其中m
是一个Mammal
,你得到Mammal
类的属性的值。 您不能通过继承覆盖变量,只能覆盖方法。 如果你向两个类都添加方法getName()
,其中两个都返回name
, m.getName()
将返回"stripes"
。
因为Zebra
是 Mammal
变量无法覆盖。 如果您将第15行更改为:
System.out.println(((Zebra) m).name + m.makeNoise());
你会得到stripes bray
答案1:取决于你想要什么。 在这种情况下,它并不那么明显。 但有时候你只想让一个物体离开1级或2级。想象一下你在斑马中有一种方法,而不是在哺乳动物中,你想要使用那种方法,那么你的物体需要离类斑马而不是哺乳动物。 但是如果有第三方课程的方法只接受哺乳动物变量,那么你必须传递一个哺乳动物。
答案2:m.name是哺乳动物的变量(不能被覆盖),m.makeNoise()是一种方法,这在Zebra中被覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.