Huy*_*han 2 java polymorphism inheritance
我有这个代码形式的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. }
Run Code Online (Sandbox Code Playgroud)
运行此代码的结果是"毛茸茸的bray".
问题1
我不明白为什么第17行不是:Zebra zebra2 = new Zebra();
以下每种情况的目的是什么,何时使用哪种?
Mammal zebra1 = new Zebra();
Run Code Online (Sandbox Code Playgroud)
VS
Zebra zebra2 = new Zebra();
Run Code Online (Sandbox Code Playgroud)
问题2
为什么变量name = "stripes"从Zebra类中重写由name = "furry"从Mammal类?我希望反对:来自子类的变量将覆盖来自超类的变量.
答案1
Mammal zebra1 = new Zebra();用于表示您可以将派生类的对象分配给父类的类型的变量.这也是一个原因Mammal m,因为你也可以有一个Lion派生自Mammal 的类并将其分配给m.m可以保存类的对象Mammal或派生自的任何类Mammal.
答案2
这也与继承有关.当你打印出来m.name,其中m一个Mammal,你得到的那属性的值Mammal类.您不能通过继承覆盖变量,只能覆盖方法.如果你要getName()为两个都返回的类添加一个方法name,m.getName()就会返回"stripes".