代码之家  ›  专栏  ›  技术社区  ›  Mrak Vladar

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

  •  5
  • Mrak Vladar  · 技术社区  · 6 年前

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

    动物类

    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
    
    3 回复  |  直到 6 年前
        1
  •  6
  •   Yousaf    6 年前

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

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

    fetch 方法未在中定义 动物 类,因此得到错误。

    解决方案

    或者定义 取来 方法在 动物

    改变

    animal doggie = new dog();
    

    dog doggie = new dog();
    
        2
  •  2
  •   Stefan    6 年前

    您正在引用 doggie.fetch() 但这不是在动物身上定义的方法。

    因为你在使用你的 doggie 对象作为动物不能使用此方法。

    如果要使用该方法,可以执行类似实例检查的操作:

     if(doggie instanceOf dog){
        ((dog)doggie).fetch();
     }
    
        3
  •  2
  •   Ratish Bansal    6 年前

    由于fetch()方法在animal中不存在,因此会引发错误。 您可以在animal中定义fetch方法,并在dog类中重写它。