实例化抽象类的引用数组时出现问题

问题描述 投票:0回答:1

我有一个带有抽象父类 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 类型。这怎么可能以及如何解决?

java arrays inheritance abstract-class
1个回答
0
投票

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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.