public class DogDriver { private class Animal { public String toString() { return "Animal"; } } private class Dog extends Animal { public String toString() { return "Dog"; } } private class HerdingDog extends Dog { public String toString() { return "herding_dog"; } } private class WorkingDog extends Dog { public String toString() { return "working_dog"; } } public void dogCaster(Dog aDog) { HerdingDog herdDog = (HerdingDog) aDog; System.out.println("Cast dog" + herdDog); } public void drive() { Object obInstance = new Object(); Animal anInstance = new Animal(); Dog dogInstance = new Dog(); WorkingDog workInstance = new WorkingDog(); System.out.println(anInstance + " " + dogInstance + " " + workInstance + " " + obInstance); Object obwork = workInstance; Animal andog = dogInstance; System.out.println(obwork + " " + andog); System.out.println( obwork.getClass().getName() + " " + andog.getClass().getName() + " " + obInstance.getClass().getName()); dogCaster(workInstance); } public static void main(String[] args) { new DogDriver().drive(); } }