public class AnimalExample2
{
    public static void main(String[] args)
    {
        Animal[] circus = new Animal[4];
        circus[0] = new Bird("Tweety");
        circus[1] = new Elephant("Dumbo");
        circus[2] = new Horse("Shadowfax");
        circus[3] = new Bird("Daffy");

        for (int k = 0; k < circus.length; k++)
            perform(circus[k]);
    }

    public static void perform(Animal a)
    {
        System.out.println("=== " + a.getName() + " ===");
        a.move();
        a.speak();
        a.speak();
        a.move();
    }
}

abstract class Animal
{
    Animal(String nm)       { name = nm; }
    public String getName() { return name; }
    public void move()      { System.out.println("walk"); }

    abstract public void speak();

    private String name;
}

class Bird extends Animal
{
    Bird(String nm)         { super(nm); }
    public void move()      { System.out.println("fly"); }
    public void speak()     { System.out.println("chirp"); }
}

class Horse extends Animal
{
    Horse(String nm)        { super(nm); }
    public void speak()     { System.out.println("neigh"); }
}

class Elephant extends Animal
{
    Elephant(String nm)     { super(nm); }
    public void speak()     { System.out.println("trumpet"); }
}
