Le mécanisme de liaison est celui qui associe à un nom l'entité qu'il désigne. Cette association est déterminée d'une part par le texte du programme, notamment par la portée lexicale des noms dans les blocs, et d'autre part par l'environnement d'exécution. Dans la plupart des langages, et même en Java pour la plupart des noms (de variables, de fonctions), la liaison d'un nom est déterminée à la compilation : c'est une liaison statique. Dans certains cas, le sous-typage conduit à retarder cette liaison jusqu'à l'exécution : c'est la liason tardive. C'est ainsi qu'un nom déclaré d'un certain type peut désigner une instance d'un sous-type :
Point pc = new PointColore(2, 3, java.awt.Color.pink), pi = new PointImmobile(2, 3), p = Math.random()>0.5 ? pc : pi; p.translater(1,1);
La troisième affectation est correcte, car de la forme « type = sous-type » : le type du nom p est Point, tandis que le type de la valeur affectée à p est PointColore ou PointImmobile. La méthode translater(double, double) de la classe Point est redéfinie dans la classe PointImmobile. L'évaluation de l'expression p.translater(1, 2) consiste à invoquer la méthode translater(double, double) définie dans la classe de l'objet désigné par p, soit celle de PointImmobile, soit celle de PointColore. La liaison du nom translater à l'une de ces méthodes ne peut être réalisée en général qu'à l'exécution, quand le type réel de p est connu. Il s'agit d'une liaison tardive, qui est une des particularités des langages orientés objets. Ce mécanisme est propre aux méthodes et ne s'applique pas aux champs ni aux fonctions.
On peut déclarer une variable ou un paramètre d'un type abstrait. Le mécanisme de liaison tardive permettra d'invoquer la méthode correcte une fois que la variable ou le paramètre désignera une instance d'une classe réalisant cette interface.
Une méthode n'est pas héritée si elle est redéfinie dans la classe dérivée, avec le même type de retour et le même profil. Par exemple, la classe PointImmobile suivante redéfinit la méthode translater de profil (double, double), de sorte qu'elle ne translate pas sa cible :
class PointImmobile extends Point { PointImmobile(double x, double y) { super(x, y); } void translater(double dx, double dy) {} }
Le mécanisme d'extension permet à la fois d'enrichir une classe en lui ajoutant des membres, et de la spécialiser, par redéfinition de certaines méthodes, pour en modifier le comportement. Le mécanisme de liaison tardive permet de tirer parti de ces redéfinitions.
Signalons que la redéfinition d'une méthode peut invoquer la méthode de la classe parente à l'aide du nom super : employé dans une méthode, il réfère à l'objet auquel s'applique cette méthode, en tant qu'instance de la classe parente. Il permet ainsi d'accéder aux membres (champs ou méthodes) définis dans la classe parente, même s'ils sont masqués ou redéfinis dans la classe contenant cette utilisation de super ; ce serait le cas si nous avions redéfini translater ainsi :
void translater(double dx, double dy) { super.translater(0, 0); }