首页 > 解决方案 > 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确实是类的类型,它不应该知道其中声明的方法吗?

标签: javaooppolymorphism

解决方案


使用多态性时,如果创建子类的实例并将其引用存储在超类类型的变量中,则只能在新创建的实例上调用超类中存在的那些方法。

在您的代码中,您创建了一个dog类实例并将其引用存储在doggie其中类型animal(狗的超类),在这种情况下,您不能调用dog类实例中不可用的任何方法animal

fetch类中未定义方法,animal因此您会收到错误消息。

解决方案

在类中定义fetch方法animal

或者

改变

animal doggie = new dog();

dog doggie = new dog();

推荐阅读