Il s'agit d'une question purement théorique.
Étant donné trois classes simples :
class Base {
}
class Sub extends Base {
}
class SubSub extends Sub {
}
Et une fonction destinée à opérer sur ces classes :
public static void doSomething(Base b) {
System.out.println("BASE CALLED");
}
public static void doSomething(Sub b) {
System.out.println("SUB CALLED");
}
Il semble que le code suivant :
SubSub ss = new SubSub();
doSomething(ss);
pourrait légitimement aboutir à l'impression de BASE CALLED, ou de SUB CALLED, puisque SubSub peut être casté dans les deux cas. En fait, la suppression de la version Sub de la fonction entraîne l'impression de BASE CALLED. Ce qui se passe en réalité, c'est que "SUB CALLED" est imprimé. Cela semble signifier que la fonction qui est appelée ne dépend pas de l'ordre dans lequel les fonctions sont définies, puisque la version Base a été appelée en premier.
Est-ce que Java regarde simplement toutes les différentes versions de la fonction et choisit celle qui nécessite la plus petite traversée de la pile d'héritage ? Est-ce que cela est normalisé ? Est-ce que c'est écrit dans la documentation ?