class A extends Object { A() { /* null constructor */ } public void printMe() { System.out.println("I'm first."); } } class B extends A { B() { /* null constructor */ } public void printMe() { System.out.println("I'm second."); } } class C extends B { C() { /* null constructor */ } public void printMe() { System.out.println("I'm third."); } } class D extends C { D() { /* null constructor */ } public void printMe() { System.out.println("Rank doesn't matter, man."); } public static void main(String[] args) { B bill = new C(); A george = new A(); Object obj = new D(); Object interim = new B(); bill.printMe(); george.printMe(); ((C) obj).printMe(); obj = bill; ((A) obj).printMe(); obj = interim; ((B) obj).printMe(); if(obj instanceof C) bill = (C) obj; else bill = (B) obj; bill = (C) obj; } }