关于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的第一个问题,非常希望有人可以帮助我理解:)
首先,如果您更改了签名,则最好更改方法的名称。这将使事情变得更加清晰。
x和y被声明为Top类,它们只有一个在编译器方面可以调用的方法:m(All)。他们被调用的实现(overiden方法)来自Middle,因此它们打印M。
Middle z有2种方法可以明智地调用编译器,即m(All)和m(Special)。编译器挂接m(All)调用,因为这是使用Most arg可以完成的全部工作。由于Bottom继承时没有覆盖m(All),因此也会打印M。