Avec la liaison dynamique, la méthode appelée est celle correspondant au type de l'objet et non au type de la variable qui le référence. Il s'agit d'un procédé dynamique dans le sens où la méthode appelée est déterminée à l'exécution (par le type de l'objet référencé) et non à la compilation.
class B{ public int i=0; public void f(){ System.out.println(i); } public void g(){ System.out.println(i); } } class A extends B { public int i=1; public void f(){ System.out.println(i); } public void h(){ System.out.println(i); } } class essai{ public static void main(String[] args){ A a = new A(); // a référence sur un objet A B b = new B(); // b référence sur un objet B b.f(); //0 b.g(); //0 a.f(); //1 a.g(); //0 a.h(); //1 b=a; b.f(); //1 b.g(); //0 //b.h(); illégal } }
Il y a surcharge (overlaoding) si des fonctions différentes et dans la même portée ont le même nom mais des signatures différentes (l'association du nom au code est déterminée à la compilation).
Si une variable d'instance d'une extension a le même nom qu'une variable d'instance d'une superclasse, elle cache ou occulte (hiding) cette variable de la superclasse : la variable de la superclasse existe encore mais n'est plus accessible par son nom simple. (on peut encore y accéder par le mot clé super).