Bonsoir,
Pour compléter ce que dit Walkhess, l'utilisation d'interfaces et de classes abstraites, ça a deux avantages.
- la factorisation de code. Selon certains, la factorisation est l'un des avantages de la programmation orientée objet, selon d'autres (et j'adhère à ce mouvement de pensée), la factorisation ça ne sert à rien, sauf parfois à concevoir de mauvais programme par souci de "sur-factorisation".
La factorisation, ça consiste à écrire des méthodes dans les classes, de manière à pouvoir les réutiliser sans les retaper dans les classes filles. C'est ce qui est utilisé lorsque tu implémentes des méthodes dans ta classe abstraite : si toutes les classes filles ont le même comportement pour cette méthode, alors elle doit être implémentée une et une seule fois dans la classe abstraite
- l'abstraction (le polymorphisme). C'est la manière d'utiliser une référence vers une interface (qui définit une série de méthodes), et d'utiliser une implémentation concrète, mais sans la connaître.
Par exemple, quand tu vas utiliser une liste (interface java.util.List), tu ne vas pas connaître quelle implémentation tu vas utiliser. Tu vas par contre savoir que tu peux insérer un élément à un endroit, en supprimer un, connaître la taille...
Et donc dans ton code, tu vas utiliser une référence vers une List.
Ensuite, tu vas utiliser réellement une implémentation de cette interface, mais d'un point de vue utilisation, tu ne sauras pas ce que c'est. Que ce soit une LinkedList (suppression et insertion en O(n) par exemple), ou une ArrayList(en temps constant pour ces méthodes), ça ne t'intéresse que lorsque tu compares les performances lors de l'implémentation initiale de ton ensemble. Une fois que c'est fait, tu fais abstraction de cet aspect "bas-niveau" pour te concentrer uniquement sur l'utilisation de ta liste, et donc tu passes par ton interface.
En espérant avoir été un peu plus loin, sans avoir été trop confus...
Cordialement
rtfm and jfgi