class Shape { } class Triangle extends Shape { } class Square extends Shape { } class Circle extends Shape { } class Canvas { public void draw(Shape s) { System.out.println("Drawing shape " + s); } } class SpecialCanvas extends Canvas { public void draw(Triangle t) { System.out.println("Special drawing triangle " + t); } public void draw(Square s) { System.out.println("Special drawing square " + s); } } class Dispatch { public static void main(String...args) { SpecialCanvas c = new SpecialCanvas(); System.out.println("Try to draw some shapes:"); for (Shape s : new Shape[] { new Circle(), new Triangle(), new Square() }) c.draw(s); System.out.println("Lets try a plain triangle instead"); c.draw(new Triangle()); } }