Caractéristiques Clés
- Non-instanciables : On ne peut pas créer d’objets directement à partir d’une classe abstraite. Elle est trop générique pour exister seule.
- Héritage obligatoire : Pour être utilisées, elles doivent être étendues par des classes concrètes (non-abstraites).
- Méthodes abstraites : Elles peuvent contenir des méthodes abstraites (déclarées avec
abstractet sans corps de méthode). Ces méthodes agissent comme un contrat : toute sous-classe concrète doit obligatoirement les implémenter (fournir un corps de méthode). - Contenu Mixte : Elles peuvent également contenir :
- Des méthodes concrètes (méthodes normales avec un corps, réutilisables par les sous-classes).
- Des variables d’instance et statiques.
- Des constructeurs (qui sont appelés lors de l’instanciation des sous-classes).
Exemple de Classe Abstraite
Imaginons que nous voulons modéliser différents types d’animaux. Le concept d’un “Animal” générique est trop vague pour être instancié directement.
// Déclaration de la classe abstraite avec le mot-clé 'abstract'
abstract class Animal {
String nom;
// Constructeur (peut être appelé par les sous-classes via 'super()')
public Animal(String nom) {
this.nom = nom;
}
// Méthode abstraite : pas de corps (seulement la signature).
// Oblige les sous-classes à définir comment l'animal émet un son.
public abstract void emettreSon();
// Méthode concrète : a un corps et est héritée telle quelle.
public void dormir() {
System.out.println(this.nom + " dort paisiblement.");
}
}
Exemples de Sous-Classes Concrètes
Les sous-classes héritent de Animal et doivent fournir l’implémentation de la méthode abstraite emettreSon().
1. Classe Chien
// La classe concrète 'Chien' étend 'Animal'
class Chien extends Animal {
public Chien(String nom) {
super(nom); // Appel du constructeur de la classe abstraite
}
// Implémentation OBLIGATOIRE de la méthode abstraite
@Override
public void emettreSon() {
System.out.println(this.nom + " aboie : Wouaf !");
}
}
2. Classe Chat
class Chat extends Animal {
public Chat(String nom) {
super(nom);
}
// Implémentation OBLIGATOIRE de la méthode abstraite
@Override
public void emettreSon() {
System.out.println(this.nom + " miaule : Miaou !");
}
}
Utilisation
public class TestAbstraction {
public static void main(String[] args) {
// Animal a = new Animal("Générique"); // ERREUR : Ne peut pas instancier une classe abstraite
Chien milou = new Chien("Milou");
Chat garfield = new Chat("Garfield");
milou.emettreSon(); // Sortie : Milou aboie : Wouaf !
milou.dormir(); // Sortie : Milou dort paisiblement.
garfield.emettreSon(); // Sortie : Garfield miaule : Miaou !
garfield.dormir(); // Sortie : Garfield dort paisiblement.
}
}
Les classes abstraites sont donc utilisées pour définir une structure commune et forcer l’implémentation de comportements spécifiques (méthodes abstraites) dans les classes dérivées.
PRÉCÉDENTSpring pas SpringBoot !!!
