【问题标题】:Why new method in subclass is not accessible using superclass reference variable为什么使用超类引用变量无法访问子类中的新方法
【发布时间】:2023-04-05 17:11:01
【问题描述】:

我在下面写了多态性的例子。

package tsys;

public class DynamicPolymorphism {
    public void eat(){
        System.out.println("DynamicPolymorphism");
    }
}
class AnotherClass extends DynamicPolymorphism{
    public void eat(){
        System.out.println("Another Class");
    }
    public void consume(){
        System.out.println("consume");
    }
}
class TestPolymorphism{
    public static void main(String args[]){
        DynamicPolymorphism dp = new AnotherClass();
        dp.eat();//Works fine
        dp.consume();//compile time error
    }
}

现在的问题是为什么编译器会抱怨dp.consume()?这个问题在一次采访中被问到我解释了原因 “在编译时,编译器只知道引用类型,因为 dp 的类型是 DynamicPolymorphism,因此编译器无法找到 consume 方法。”

面试官反驳我的回答并询问编译器给出错误的幕后发生了什么,但是我们将变量 dp 引用到 AnotherClass 的实例。

我还能对面试官的反问做出什么解释?

【问题讨论】:

  • 投反对票的人,你能解释一下问题有什么问题,以便我改进吗?
  • 我会要求澄清,因为我不明白柜台问题。没有“幕后”。编译器知道dpDynamicPolymorphism,所以它只允许调用它知道的,即调用DynamicPolymorphism 声明的方法。基本如你所说。这就是像 Java 这样的 statically-typed 语言的基本性质。
  • @Andreas 您的回答很贴切,我只是在看这里,关于多态性,我是否遗漏了一些东西。谢谢

标签: java polymorphism subclass superclass


【解决方案1】:

dp 被声明为 DynamicPolymorphism。因此对AnotherClass的方法一无所知。如果你想调用consume,那么你需要typecast并调用consume。 试试 ((AnotherClass)dp).cosume()

【讨论】:

  • OP 已经意识到了这一点。请阅读整个问题。
  • 根据 DynamicPolymorphism 类的约定,只有吃是可见的。因此,在编译期间必须使用类型转换才能看到。
猜你喜欢
  • 2017-08-22
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 2012-07-04
相关资源
最近更新 更多