首页 > 解决方案 > 关于方法调用的Java多态性的困惑

问题描述

我在处理这个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()

资源

标签: javaclassinheritancepolymorphismclass-hierarchy

解决方案


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

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

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


推荐阅读