【问题标题】:Confusion on Java Polymorphism regarding method calling关于方法调用的Java多态性的困惑
【发布时间】:2020-01-28 20:10:47
【问题描述】:

我在处理这个 Java 问题时遇到了问题:

考虑以下类:

​
public class Computer extends Mineral {
    public void b() {
        System.out.println("Computer b");
        super.b();
    }

    public void c() {
        System.out.println("Computer c");
    }
}
​
public class Mineral extends Vegetable {
    public void b() {
        System.out.println("Mineral b");
        a();
    }
}
​
public class Animal extends Mineral {
    public void a() {
        System.out.println("Animal a");
    }

    public void c() {
        b();
        System.out.println("Animal c");
    }
}
​
public class Vegetable {
    public void a() {
        System.out.println("Vegetable a");
    }
​
    public void b() {
        System.out.println("Vegetable b");
    }
}

假设定义了以下变量:

Vegetable var1 = new Computer();
Mineral   var2 = new Animal();
Vegetable var3 = new Mineral();
Object    var4 = new Mineral();

在每条语句产生的输出下方的每一行上注明 显示。如果语句产生多于一行的输出,则表明 用斜线换行,如 a/b/c 以表示三行 输出 a 后跟 b 后跟 c。如果该语句导致 错误,写下错误一词来表明这一点。

为了执行

var1.b()

我对输出感到困惑

通过仔细分析,我们必须注意到,当我们调用矿物的方法b()时:

public void b() {
        System.out.println("Mineral b");
        a();
    }

我们也在调用一个方法

a()

因此,使用类层次图,可以调用方法

Vegetable.a()

source

【问题讨论】:

  • 你好。请不要依赖第三方网站为您的问题提供关键内容。尝试从网站中提取问题并将其包含在 Stack Overflow 上。
  • 对不起,我会这样做,但网站禁用了复制粘贴,所以我别无选择。希望这不是问题
  • 您能否尝试改写以提出特定问题,帖子似乎没有重点。
  • 您也可以使用 IDE 来验证您的逻辑。我认为你应该推断你不理解的 var1.b() 的哪一部分。你可以在你的问题中重新创建你的学校材料中的例子的要点。你的想法都是正确的,所以你需要解释你不明白的地方。
  • 顺便说一下var1.b()的输出是Computer b/Mineral b/Vegetable a。您可以考虑重新表述您的问题。

标签: java class inheritance polymorphism class-hierarchy


【解决方案1】:

Vegetable var1 = new Computer(); 中,您有一个Vegetable 类型的引用变量,指向Computer 类型的对象。如果蔬菜是计算机的超类型,则该分配是有效的。

如果引用变量 (Vegetable) 的类型有方法 b(),则表达式 var1.b() 将是合法的(编译通过)。如果蔬菜类型没有方法b(),那么表达式会报编译错误。

如果编译通过:在运行时,调用var1.b() 将调用变量var1 指向的对象上的b() 方法(即Computer 类型的实例)。 Computer.b() 覆盖 Mineral.b(),因此将调用该方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2013-09-09
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    相关资源
    最近更新 更多