public class A {
    public static void main(String[] args) {
        B b = new B();
        A a = new B();
        a.f();
        A aaa = (A) b;
        aaa.f();
    }
    public void f() {
        System.out.println("I'm A");
    }
}
class B extends A {
    public void f() {
        System.out.println("I'm B");
    }
}
i ran this code, and get the result as below:
I'm B
I'm B
both a and aaa have a instance of B, so i think the result is reasonable.
however, i ran another code, like this:
public class Atest {
    public static void main(String[] args) {
        Atest a1 = new Atest();
        Object a2 = new Atest();
        System.out.println(a1.equals(a2));
        System.out.println(a2.equals(a1));
        System.out.println(a1.equals(new C()));
        System.out.println(a2.equals(new C()));
    }
    public boolean equals(Object o) {
        System.out.println("equals(Object o) is called!");
        return true;
    }
    public boolean equals(Atest a) {
        return true;
    }
    public boolean equals(C c) {
        System.out.println("equals(C c) is called!");
        return true;
    }
}
class C {
}
and, i got the result
equals(Object o) is called!
true
equals(Object o) is called!
true
equals(C c) is called!
true
equals(Object o) is called!
true
i am confused that a2.equals(new C()) call the function public boolean equals(Object o) 
a2 is an instance of Atest, i think a2.equals(new C()) should call the function public boolean equals(C c).
anybody can help me? really thanks!
 
     
     
    