Java 为什么子类中的新方法不能使用超类引用变量访问

Java 为什么子类中的新方法不能使用超类引用变量访问,java,polymorphism,subclass,superclass,Java,Polymorphism,Subclass,Superclass,我在下面写了多态性的例子 package tsys; public class DynamicPolymorphism { public void eat(){ System.out.println("DynamicPolymorphism"); } } class AnotherClass extends DynamicPolymorphism{ public void eat(){ System.out.println("Anothe

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

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引用到另一个类的实例


针对反问题,我还能向面试官解释什么

dp被称为动态多态。因此,他对另一个类的方法一无所知。如果您想调用consume,那么您需要进行类型转换并调用consume。
试一试另一个classdp.cosume

downvoctors,你能解释一下这个问题有什么不对吗?我会要求澄清的,因为我不理解反问题。没有幕后活动。编译器知道dp是一个DynamicPolymorphism,因此它只允许它知道的调用,即调用DynamicPolymorphism声明的方法。基本上就是你说的。这是像Java这样的语言的基本特性。@Andreas你的回答很贴切,我只是在这里看看,关于多态性,我有没有遗漏什么。谢谢OP已经意识到了这一点。请阅读整个问题。根据DynamicPolymorphism类的合同,只有eat是可见的。因此,类型转换是必须的,以便在编译期间可以看到。