我正在尝试了解多态性和继承。所以我写了一些代码,试图追溯发生的事情。
我不明白为什么最后三个方法也不打印“ B”。对象的引用变量始终是Top,而参数始终是扩展Top的类的对象。如果后三种方法打印出C,K和X:不应tm.m(mm);打印J? 我不明白,有人可以向我解释吗?
public class polymorphie
{
class Top
{
public void m( Top p ) { System.out.print("B"); }
public void m( Bottom p ) { System.out.print("C"); }
}
class Middle extends Top
{
public void m( Bottom p ) { System.out.print("K"); }
public void m( Middle p ) { System.out.print("J"); }
}
class Bottom extends Middle
{
public void m( Middle p ) { System.out.print("W"); }
public void m( Bottom p ) { System.out.print("X"); }
}
public void run()
{
Top tt = new Top();
Top tm = new Middle();
Top tb = new Bottom();
Middle mm = new Middle();
Middle mb = new Bottom();
Bottom bb = new Bottom();
tt.m(tt); // B
tt.m(tm);
tt.m(tb);
tt.m(mm);
tt.m(mb);
tm.m(tt);
tm.m(tm);
tm.m(tb);
tm.m(mm); // why not J?
tm.m(mb);
tb.m(tt);
tb.m(tm);
tb.m(tb);
tb.m(mm);
tb.m(mb);
System.out.println();
tt.m(bb); // C
tm.m(bb); // K
tb.m(bb); // X
}
}
答案 0 :(得分:1)
结果是,行tm.m(mm);
的输出为B,因为调用的方法是 Top 类的public void m( Top p )
。
这里有两个概念:
Top tm = new Middle();
行中,即使您用中产阶级的cosuctor构造tm
,它仍然是对 Top 类型的对象的引用,因此, tm
对象将是 Top 类的方法。如果未在其子类中覆盖这些方法,则这些方法的实现是用Top类编写的。public void m( Top p )
方法在中产阶级。因此,顶级类的方法不会被其子类的方法覆盖。您应该查看行
tm.m(bb); // K
tb.m(bb); // X
作为我所说的例子。实际上, tm 是Top,但是方法public void m(Bottom)
在Top和Middle类中都存在,因此使用Middle类的实现,并且该方法输出'K'而不是'C' 。 tb 的相同原因:它是对Top对象的引用,但是在“ granmother”类Top中,方法public void m( Bottom p )
被覆盖,因为这两个类中的方法具有完全相同的签名。