从超类的数组调用子类的方法

Calling a Method of a Subclass From an Array of the Superclass

请考虑以下事项。 您有一只狗 Class 和一只猫 Class,它们都扩展了 Class 动物。 如果您创建一个 Animals 数组,例如

Animal[] animals = new Animal[5];

在这个数组中 5 随机猫和狗被设置为每个元素。 如果 Dog Class 包含方法 bark() 而 Cat Class 不包含,那么如何根据数组调用此方法?例如

animals[3].bark();

我试过投射元素,我正在检查狗但无济于事例如

(Dog(animals[3])).bark();

选项 1:使用 instanceof(不推荐):

if (animals[3] instanceof Dog) {
    ((Dog)animals[3]).bark();
}

选项 2:使用抽象方法增强 Animal

public abstract class Animal {
    // other stuff here
    public abstract void makeSound();
}
public class Dog extends Animal {
    // other stuff here
    @Override
    public void makeSound() {
        bark();
    }
    private void bark() {
        // bark here
    }
}
public class Cat extends Animal {
    // other stuff here
    @Override
    public void makeSound() {
        meow();
    }
    private void meow() {
        // meow here
    }
}