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.