class A            { int bin(A x){ return 1; } }
class B extends A{
  int bin(A x){
    if (x instanceof B) return bin((B)(x));
    else return  super.bin(x);
  }
  int bin(B x){ return 2; }
}

class  AB{
  static A aa = new A();
  static B bb = new B();
  static A ab = bb;
  static void print (String s, int r){
    System.out.print(s); System.out.println(r);
  }
  public static void main (String argv[]) {
    print ("aa.bin(aa)=",aa.bin(aa));
    print ("aa.bin(ab)=",aa.bin(ab));
    print ("aa.bin(bb)=",aa.bin(bb));
    print ("ab.bin(aa)=",ab.bin(aa));
    print ("ab.bin(ab)=",ab.bin(ab));
    print ("ab.bin(bb)=",ab.bin(bb));
    print ("bb.bin(aa)=",bb.bin(aa));
    print ("bb.bin(ab)=",bb.bin(ab));
    print ("bb.bin(bb)=",bb.bin(bb));
  }
}
Le résultat est toujours 2 dès que x et y sont tous deux de la class B, indépendemment de leur type statique. En effet dès que x est de la classe B, la méthode bin est choisie dans la classe B indépendemment du type (statique) de x. Par ailleurs, les deux implémentations de bin dans la classe B retournent 2 dès que y est un objet de la classe B.