【问题标题】:which function is used in these extended classes?这些扩展类中使用了哪个函数?
【发布时间】:2019-11-14 12:41:42
【问题描述】:

我正在尝试理解多态性和继承。所以我写了一些代码并试图追溯发生了什么。

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

【问题讨论】:

  • 您可以将完整的输出添加到您的帖子中吗?我发布了一个答案,但在我意识到我看错后删除了,这导致了更多问题。
  • 输出为 BBBBBBBBBBBBBBB C K X

标签: inheritance polymorphism extend


【解决方案1】:

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

这里有两个概念:

  1. Top tm = new Middle();这一行中,即使你用Middle class costructor来构造tm,它仍然是对Top类型对象的引用,所以tm对象的方法将是 Top 类的方法。这些方法的实现是写在 Top 类中的,如果它们没有在其子类中被覆盖。
  2. 顶级类Top及其子类Middle中涉及方法的签名不同:方法public void m( Top p )在Middle类中不存在.因此,顶级类的方法不会被其子类的方法覆盖。

你应该看线

 tm.m(bb);                       // K   
 tb.m(bb);                       // X

作为我所说的一个例子。实际上tm是一个Top,但是方法public void m(Bottom)在Top和Middle类中都存在,所以使用了Middle类的实现,方法打印的是'K'而不是'C'。 tb 的原因相同:它是对 Top 对象的引用,但在“祖母”类 Top 中,方法 public void m( Bottom p ) 被覆盖,因为它在两个类中具有完全相同的签名。

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 2021-10-03
    • 2011-08-20
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多