Java中的多态性错误:找不到符号

我刚从书头开始学习面向对象编程,首先是java。它说多态使我能够创建超类类型的数组,然后将所有子类作为数组元素。但是当我尝试使用相同的代码编写代码时原则它遇到错误,说 error: cannot find symbol 我将超类设为动物的类,而狗类扩展了具有自己的 fetch 方法的动物类,但是当我将狗变量引用为动物时,它在这里不起作用是代码


动物类:


public class animal{

        

    String family;

    String name;

    

    public void eat() {

        System.out.println("Ghap Ghap");

    }


    public void roam() {

        System.out.println("paw paw");

    }


}

狗类:


public class dog extends animal {

    public void fetch() {

        System.out.println("Auoooooooo");

    }

}

测试者类:


public class tester {


    public static void main(String args[]){

        animal doggie = new dog();

        doggie.fetch();

        doggie.eat();

        doggie.roam();

    }


}

错误:


tester.java:4: error: cannot find symbol

doggie.fetch();

      ^

symbol:   method fetch()

location: variable doggie of type animal

1 error


编辑:上次我问这个问题时,我回家时认为该对象doggie属于该类型animal,并且它不知道fetch()已在dog类中声明的函数。但是添加行


System.out.println(doggie.getClass().getName()); 

给出dog作为类的类型,如果dog确实是类的类型,它不应该知道其中声明的方法吗?


慕容森
浏览 197回答 3
3回答

呼啦一阵风

使用多态性时,如果创建子类的实例并将其引用存储在超类类型的变量中,则只能在新创建的实例上调用超类中存在的那些方法。在您的代码中,您创建了一个dog类实例并将其引用存储在doggie其中类型animal(狗的超类),在这种情况下,您不能调用dog类实例中不可用的任何方法animal。fetch类中未定义方法,animal因此您会收到错误消息。解决方案在类中定义fetch方法animal或者改变animal doggie = new dog();到dog doggie = new dog();

MMMHUHU

由于动物中不存在 fetch() 方法,因此会引发错误。你可以在 animal 中定义一个 fetch 方法并在 dog 类中覆盖它。

萧十郎

您正在引用doggie.fetch(),但这不是动物中定义的方法。由于您将doggie对象用作动物,因此不能使用此方法。如果您想使用该方法,可以执行实例检查之类的操作: if(doggie instanceOf dog){    ((dog)doggie).fetch(); }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java