gpt4 book ai didi

java - 继承和多态问题

转载 作者:行者123 更新时间:2023-12-02 07:05:51 24 4
gpt4 key购买 nike

我从 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”。

问题一

我不明白为什么第 17 行不是: 斑马 zebra2 = new Zebra();

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

Mammal zebra1 = new Zebra();

对比

Zebra zebra2 = new Zebra();   

问题二

为什么 Zebra 类中的变量 name = "stripes" 类中的 name = "furry" 覆盖了哺乳动物类?我希望相反:子类中的变量将覆盖父类(super class)中的变量。

最佳答案

答案 1

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

答案 2

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

关于java - 继承和多态问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12136584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com