class X { String m( X arg ) { return "X " + arg.getClass(); } } class Y extends X { String m( Y arg ) { return "Y " + arg.getClass(); } } public class OverloadTest { public static void main(String[] args) { X x = new Y(); Y y = (Y) x; System.out.println( x.m(x)); System.out.println( x.m(y)); System.out.println( y.m(x)); System.out.println( y.m(y)); System.out.println( y.m( (X) y)); } }