// Animal Classes abstract class Animal { String name; double multiplier; Animal(String name, double percentAbility) { this.name = name; this.multiplier = percentAbility / 100; } abstract double typicalTopSpeed(); abstract String typeOfAnimal(); double topSpeed() { return this.multiplier * typicalTopSpeed(); } } class Greyhound extends Animal { Greyhound(String name, double percentAbility) { super(name, percentAbility); } String typeOfAnimal() { return "greyhound"; } double typicalTopSpeed() { return 43; } } class Ostrich extends Animal { Ostrich(String name, double percentAbility) { super(name, percentAbility); } String typeOfAnimal() { return "ostrich"; } double typicalTopSpeed() { return 40; } } // Race Class class Race { Animal runner1; Animal runner2; Race(Animal animal1, Animal animal2) { this.runner1 = animal1; this.runner2 = animal2; } String whoLoses() { if (this.runner1.topSpeed() > this.runner2.topSpeed()) { return runner2.name; } else if (this.runner2.topSpeed() > this.runner1.topSpeed()) { return runner1.name; } else { return "neither"; } } String results() { String results = "In a race between "; results += this.runner1.name; results += " the " + this.runner1.typeOfAnimal(); results += " and " + this.runner2.name; results += " the " + this.runner2.typeOfAnimal(); results += ", " + this.whoLoses(); results += " loses."; return results; } } // Main Method Class class GoDogGo { static void go() { Greyhound grit = new Greyhound("Grit", 110); Ostrich oliver = new Ostrich("Oliver", 120); Race race = new Race(grit, oliver); System.out.print(race.results()); } public static void main(String[] args) { GoDogGo.go(); } }