Przeciążanie Java i reguły dziedziczenia

Studiowałem, ponieważ mam egzamin i nie mam wielu problemów z większością Java, ale natknąłem się na regułę, której nie potrafię wyjaśnić. Oto fragment kodu:

public class A {

    public int method(Object o) {
        return 1;
    }

    public int method(A a) {
        return 2;
    }
}

public class AX extends A {

    public int method(A a) {
        return 3;
    }

    public int method(AX ax) {
        return 4;
    }
}

public static void main(String[] args) {
    Object o = new A();
    A a1 = new A();
    A a2 = new AX();
    AX ax = new AX();

    System.out.println(a1.method(o));
    System.out.println(a2.method(a1));
    System.out.println(a2.method(o));
    System.out.println(a2.method(ax));
}

To zwraca:

1 3 1 3

Chociaż spodziewałbym się, że wróci:

1 3 1 4

Dlaczego typ a2 określa, która metoda jest wywoływana w AX?

Czytałem o regułach przeciążania i dziedziczenia, ale wydaje się to na tyle niejasne, że nie udało mi się znaleźć dokładnej reguły. Każda pomoc byłaby bardzo mile widziana.

questionAnswers(3)

yourAnswerToTheQuestion