我有一个带有抽象父类 Animal 的程序,以及从它扩展的 3 个子类。
import java.util.Scanner;
abstract class Animal{
String name, breed, color;
int age;
}
class Dog extends Animal{
void bark(){
System.out.println("Dog:-\nwoof-woof!!!");
}
}
class Cat extends Animal{
void meow(){
System.out.println("Cat-\nmeowww!");
}
}
class Lion extends Animal{
void roar(){
System.out.println("Lion:-\nGgrrrrr!!");
}
}
class AnimalMain{
public static void main(String args[]){
Animal a[]= new Animal[3];
a[0]=new Dog();
a[1]=new Cat();
a[2]=new Lion();
a[0].bark();
a[1].meow();
a[2].roar();
}
}
但是,我收到错误消息,指出未找到方法 bark()、meow() 和 roar()。即,
source_file.java:97:错误:找不到符号
a[0].bark();
^
符号:方法bark()
地点:动物班
source_file.java:98:错误:找不到符号
a[1].meow();
^
符号:方法meow()
地点:动物班
source_file.java:99:错误:找不到符号
a[2].roar();
^
符号:方法roar()
地点:动物班
3 个错误
不知何故,这些对象似乎仍然是 Animal 类型。这怎么可能以及如何解决?
a
的元素是对Animal
的引用。即,虽然它们可能包含 Animal
的任何子类的对象,但在编译时,编译器不知道可能恰好位于特定索引处的确切实例,因此只允许使用存在于Animal
班。
如果您确定知道特定索引处的实例是什么(例如,因为您将其放置在那里),则可以显式向下转换它并使用该实例的方法,例如:
a[0] = new Dog();
((Dog)(a[0])).bark();
话虽如此,更惯用的方法是将逻辑移至抽象类中的方法:
abstract class Animal{
String name, breed, color;
int age;
abstract void noise();
}
class Dog extends Animal{
void bark(){
System.out.println("Dog:-\nwoof-woof!!!");
}
@Override
public void noise() {
bark();
}
}
class Cat extends Animal{
void meow(){
System.out.println("Cat-\nmeowww!");
}
@Override
public void noise() {
meow();
}
}
class Lion extends Animal{
void roar(){
System.out.println("Lion:-\nGgrrrrr!!");
}
@Override
public void noise() {
roar();
}
}
class AnimalMain{
public static void main(String args[]){
Animal arr[]= new Animal[3];
arr[0]=new Dog();
arr[1]=new Cat();
arr[2]=new Lion();
for (Animal a : arr) {
a.noise();
}
}
}