class Mammal {
String name = "furry ";
 String makeNoise() { return "generic noise"; }
 }
 class Zebra extends Mammal {
 String name = "stripes ";
 String makeNoise() { return "bray"; }
 }
 public class ZooKeeper {
public static void main(String[] args)
 { new ZooKeeper().go(); }
void go() {
 Mammal m = new Zebra();
 System.out.println(m.name + m.makeNoise());
 }
}为什么运行结果是:
furry bray难道Zebra的name不会把Mammal的name重写了吗?如果能够推荐看什么参考书可以解决类似问题那就更好了!

解决方案 »

  1.   

    你听说过 重写 field 这一说法吗?override overload 只适用于  方法吧?
      

  2.   


    field 是【编译】时确定的
    method是【运行】时确定的本人是这么理解的, 不知道对错m.name + m.makeNoise()  
    前者在编译的时候已经确定了 m 的类型,后者则是运行时
     
      

  3.   

    数据是先期绑定.而函数是后期绑定,要在调用才确定。new Zebra();实际创造了一个zebra对象,所以会调用zebra的方法。