Les points, les cercles et les rectangles peuvent être translatés, ils ont tous une surface, mais les instructions à exécuter pour les translater ou pour calculer leur surface dépend de la classe de l'objet considéré.
package geometrie; class TestSurface { public static void main(String[] args) { Point o1 = new Point(), o2 = new Point(), p = new Point(1, 1); Cercle c = new Cercle(o1, 2); Rectangle r = new Rectangle(o2, p); double sp = p.surface(); double sc = c.surface(); double sr = r.surface(); } }
Supposons maintenant que l'on veuille tirer un objet de l'un de ces types au hasard, à pile ou face, puis calculer sa surface. Il semble naturel de former l'expression suivante :
(Math.random()>0.5 ? c : r).surface();
Cependant l'expression
Forme c = new Cercle(o1, 2); Forme r = new Rectangle(o2, p);
Le type Forme n'est pas une classe, mais une « interface » ; il ne définit pas la méthode surface, mais il la déclare, puisque toute forme a une surface, mais que le calcul de la surface ne peut être fait que pour une forme particulière. La méthode surface de l'interface Forme ne peut pas avoir de corps ; on dit que c'est une méthode abstraite et on la déclare en remplaçant le corps par un «;».
interface Forme { double surface(); }