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

Mra*_*dar 4 java oop polymorphism

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

动物类

public class animal{
String family;
String name;
public void eat()
{
    System.out.println("Ghap Ghap");
}
public void roam()
{
    System.out.println("paw paw");
}
}
Run Code Online (Sandbox Code Playgroud)

狗班

public class dog extends animal{
public void fetch(){
    System.out.println("Auoooooooo");
}
}
Run Code Online (Sandbox Code Playgroud)

测试者班

public class tester{
public static void main(String args[]){
    animal doggie = new dog();
    doggie.fetch();
    doggie.eat();
    doggie.roam();
}
Run Code Online (Sandbox Code Playgroud)

}

错误

tester.java:4: error: cannot find symbol
doggie.fetch();
      ^
symbol:   method fetch()
location: variable doggie of type animal
1 error
Run Code Online (Sandbox Code Playgroud)

You*_*saf 6

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

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

fetch方法没有在animal类中定义,因此您得到错误.

fetchanimal类中定义方法

要么

更改

animal doggie = new dog();
Run Code Online (Sandbox Code Playgroud)

dog doggie = new dog();
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 3

您正在引用doggie.fetch()但这不是 Animal 中定义的方法。

由于您将doggie对象用作动物,因此无法使用此方法。

如果您想使用该方法,您可以执行诸如实例检查之类的操作:

 if(doggie instanceOf dog){
    ((dog)doggie).fetch();
 }
Run Code Online (Sandbox Code Playgroud)