Java多态-两个类层次结构方法重载

问题描述 投票:1回答:1

关于Java中的多态性,我有一个简短的问题:这是两个类层次结构,其目的是告诉代码将要输出的内容。

class All { /* ... */ }
class Most extends All { /* ... */ }
class Special extends Most { /* ... */ }

class Top {
    public void m( All p ) { System.out.print("A "); }
}
class Middle extends Top {
    public void m( All p ) { System.out.print("M "); }
    public void m( Special p ) { System.out.print("L "); }
}
class Bottom extends Middle {
    public void m( Most p ) { System.out.print("V "); }
    public void m( Special p ) { System.out.print("X "); }
}

class Test {

    public static void main(String[] args) {
        All all = new All();
        Most most = new Most();
        Special special = new Special();

        Top x = new Middle();
        Top y = new Bottom();
        Middle z = new Bottom();

        x.m( most );
        x.m( special );

        y.m( all );
        y.m( special );

        z.m( all );
        z.m( most );
    }
}

我将代码粘贴到Eclipse .java文件中,并打印出6x M,因此每种方法都为M。谁能帮我理解?

[显然,调用引用的参数的声明类型和参数很重要,而没有其他内容(根据脚本),但是在那种情况下,为什么x.m(special)不打印出“ L”,因为Special是方法?

PS:关于stackoverflow的第一个问题,非常希望有人可以帮助我理解:)

java polymorphism hierarchy
1个回答
2
投票

首先,如果您更改了签名,则最好更改方法的名称。这将使事情变得更加清晰。

x和y被声明为Top类,它们只有一个在编译器方面可以调用的方法:m(All)。他们被调用的实现(overiden方法)来自Middle,因此它们打印M。

Middle z有2种方法可以明智地调用编译器,即m(All)和m(Special)。编译器挂接m(All)调用,因为这是使用Most arg可以完成的全部工作。由于Bottom继承时没有覆盖m(All),因此也会打印M。

© www.soinside.com 2019 - 2024. All rights reserved.