【问题标题】:Inheritance and polymorphism problems继承和多态问题
【发布时间】:2012-08-27 05:23:22
【问题描述】:

我有这个来自 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. }

运行此代码的结果是“furry bray”。

问题 1

我不明白为什么第 17 行不是: 斑马斑马2 =新斑马();

以下每种情况的目的是什么,什么时候使用?

Mammal zebra1 = new Zebra();

Zebra zebra2 = new Zebra();   

问题 2

为什么Zebra 类中的变量name = "stripes"Mammal 类中的name = "furry" 覆盖?我希望相反:子类中的变量将覆盖超类中的变量。

【问题讨论】:

    标签: java inheritance polymorphism


    【解决方案1】:

    回答 1

    Mammal zebra1 = new Zebra(); 用于表明您可以将派生类的对象分配给父类类型的变量。这也是Mammal m 的一个原因,因为您还可以有一个派生自哺乳动物的类Lion 并将其分配给mm 可以包含类 Mammal 或派生自 Mammal 的任何类的对象。

    答案 2

    这也与继承有关。当您打印出m.name(其中mMammal)时,您将获得Mammal 类的该属性的值。您不能通过继承覆盖变量,只能覆盖方法。 如果您要向两个类都添加一个方法 getName() 并且两者都将返回 name,那么 m.getName() 将返回 "stripes"

    【讨论】:

    • 感谢您快速详细的回答。现在我明白了。
    • 不客气。如果您喜欢我的回答,请“接受”(使用左侧的“检查”符号)
    【解决方案2】:

    答案 1:取决于你想要什么。在这种情况下,它并不那么明显。但有时您只希望对象不属于 1 类或 2 类。假设您在斑马而不是哺乳动物中有一个方法,并且您想使用该方法,那么您的对象需要不属于斑马类而不是哺乳动物。但是如果有一个第三方类的方法只接受哺乳动物变量,那么你必须传递一个哺乳动物对象。

    Answer2:m.name 是哺乳动物的变量(不能被覆盖),m.makeNoise() 是一个方法,在 Zebra 中被覆盖。

    【讨论】:

      【解决方案3】:
      1. 因为Zebra Mammal

      2. 变量不能被覆盖。如果将第 15 行更改为:

        System.out.println(((Zebra) m).name + m.makeNoise());

        你会得到stripes bray

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-19
        • 2011-12-19
        • 1970-01-01
        相关资源
        最近更新 更多