继承和多态问题

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类?我希望反对:来自子类的变量将覆盖来自超类的变量.

Rid*_*lly 6

答案1

Mammal zebra1 = new Zebra();用于表示您可以将派生类的对象分配给父类的类型的变量.这也是一个原因Mammal m,因为你也可以有一个Lion派生自Mammal 的类并将其分配给m.m可以保存类的对象Mammal或派生自的任何类Mammal.

答案2

这也与继承有关.当你打印出来m.name,其中m一个Mammal,你得到的那属性的值Mammal类.您不能通过继承覆盖变量,只能覆盖方法.如果你要getName()为两个都返回的类添加一个方法name,m.getName()就会返回"stripes".