这些扩展类中使用哪个函数?

时间:2019-07-03 19:14:12

标签: inheritance polymorphism extend

我正在尝试了解多态性和继承。所以我写了一些代码,试图追溯发生的事情。

我不明白为什么最后三个方法也不打印“ 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
        }      
}

1 个答案:

答案 0 :(得分:1)

结果是,行tm.m(mm);的输出为B,因为调用的方法是 Top 类的public void m( Top p )

这里有两个概念:

  1. Top tm = new Middle();行中,即使您用中产阶级的cosuctor构造tm,它仍然是对 Top 类型的对象的引用,因此, tm对象将是 Top 类的方法。如果未在其子类中覆盖这些方法,则这些方法的实现是用Top类编写的。
  2. 所涉及方法的签名在顶级类 Top 和其子类 Middle 中是不同的: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 )被覆盖,因为这两个类中的方法具有完全相同的签名。