7.1Classes abstraites
7.1.1 â MĂ©thodes abstraites
Une mĂ©thode abstraite est une mĂ©thode dĂ©clarĂ©e sans implĂ©mentation (sans corps). Elle est marquĂ©e avec le mot-clĂ© abstract et se termine par un point-virgule au lieu d'un bloc de code. Les mĂ©thodes abstraites doivent ĂȘtre implĂ©mentĂ©es par toutes les classes filles non abstraites.
đ CaractĂ©ristiques des mĂ©thodes abstraites
- Déclarée avec le mot-clé
abstract - N'a pas de corps (pas d'implémentation)
- Se termine par un point-virgule
- Doit ĂȘtre implĂ©mentĂ©e par les classes filles non abstraites
- Ne peut exister que dans une classe abstraite
Exemple : Classe abstraite avec méthode abstraite
public abstract class Forme {
protected String couleur;
// Méthode abstraite : pas d'implémentation
public abstract double calculerAire();
// Méthode abstraite avec paramÚtres
public abstract double calculerPerimetre();
// MĂ©thode concrĂšte (non abstraite) : peut ĂȘtre utilisĂ©e telle quelle
public void afficher() {
System.out.println("Forme de couleur " + couleur);
System.out.println("Aire : " + calculerAire()); // Appelle la méthode abstraite
}
// Une classe abstraite peut avoir des méthodes concrÚtes
public void setCouleur(String couleur) {
this.couleur = couleur;
}
}
â ïž RĂšgles importantes
- Une méthode abstraite ne peut exister que dans une classe abstraite
- Une classe avec au moins une mĂ©thode abstraite doit ĂȘtre dĂ©clarĂ©e
abstract - Les classes filles non abstraites doivent implémenter toutes les méthodes abstraites
- Une mĂ©thode abstraite ne peut pas ĂȘtre
privateoufinal - Une mĂ©thode abstraite ne peut pas ĂȘtre
static
đĄ Pourquoi utiliser des mĂ©thodes abstraites ?
Les méthodes abstraites permettent de :
- Définir un contrat : Forcer les classes filles à implémenter certaines méthodes
- Polymorphisme : Utiliser différentes implémentations de maniÚre uniforme
- Structure : Organiser le code en dĂ©finissant ce qui doit ĂȘtre fait sans spĂ©cifier comment
7.1.2 â Utilisation
Pour utiliser une classe abstraite, vous devez créer une classe fille qui hérite de la classe abstraite et implémente toutes les méthodes abstraites.
đ ImplĂ©mentation des mĂ©thodes abstraites
Les classes filles doivent fournir une implémentation pour toutes les méthodes abstraites de la classe mÚre.
Exemple : Implémentation complÚte
public abstract class Forme {
protected String couleur;
public abstract double calculerAire();
public abstract double calculerPerimetre();
public void setCouleur(String couleur) {
this.couleur = couleur;
}
}
// Classe Cercle : implémente toutes les méthodes abstraites
public class Cercle extends Forme {
private double rayon;
public Cercle(double rayon) {
this.rayon = rayon;
}
@Override
public double calculerAire() {
return Math.PI * rayon * rayon;
}
@Override
public double calculerPerimetre() {
return 2 * Math.PI * rayon;
}
}
// Classe Rectangle : implémente toutes les méthodes abstraites
public class Rectangle extends Forme {
private double largeur;
private double hauteur;
public Rectangle(double largeur, double hauteur) {
this.largeur = largeur;
this.hauteur = hauteur;
}
@Override
public double calculerAire() {
return largeur * hauteur;
}
@Override
public double calculerPerimetre() {
return 2 * (largeur + hauteur);
}
}
đ« Instanciation impossible
Une classe abstraite ne peut pas ĂȘtre instanciĂ©e directement. Vous devez crĂ©er une classe fille concrĂšte.
Exemple : Erreur d'instanciation
// â ERREUR : Impossible d'instancier une classe abstraite
// Forme f = new Forme();
// â
CORRECT : Instancier une classe fille concrĂšte
Forme cercle = new Cercle(5.0);
Forme rectangle = new Rectangle(4.0, 6.0);
// Utilisation polymorphique
cercle.setCouleur("Rouge");
System.out.println("Aire du cercle : " + cercle.calculerAire());
rectangle.setCouleur("Bleu");
System.out.println("Aire du rectangle : " + rectangle.calculerAire());
đ Utilisation polymorphique
Les classes abstraites permettent l'utilisation du polymorphisme, comme avec les classes normales.
Exemple : Polymorphisme avec classes abstraites
public class TestFormes {
public static void main(String[] args) {
// Tableau polymorphique
Forme[] formes = {
new Cercle(5.0),
new Rectangle(4.0, 6.0),
new Cercle(3.0)
};
// Traiter toutes les formes de maniĂšre uniforme
for (Forme forme : formes) {
System.out.println("Aire : " + forme.calculerAire());
System.out.println("PérimÚtre : " + forme.calculerPerimetre());
System.out.println("---");
}
}
}
đ Exemple complet : SystĂšme de vĂ©hicules
Exemple : Hiérarchie de véhicules
public abstract class Vehicule {
protected String marque;
protected int annee;
public Vehicule(String marque, int annee) {
this.marque = marque;
this.annee = annee;
}
// Méthode abstraite : chaque véhicule doit avoir une façon de démarrer
public abstract void demarrer();
// MĂ©thode abstraite : chaque vĂ©hicule doit avoir une façon de s'arrĂȘter
public abstract void arreter();
// Méthode concrÚte : commune à tous les véhicules
public void afficherInfo() {
System.out.println("Marque : " + marque + ", Année : " + annee);
}
}
public class Voiture extends Vehicule {
public Voiture(String marque, int annee) {
super(marque, annee);
}
@Override
public void demarrer() {
System.out.println("La voiture démarre avec une clé");
}
@Override
public void arreter() {
System.out.println("La voiture s'arrĂȘte");
}
}
public class Moto extends Vehicule {
public Moto(String marque, int annee) {
super(marque, annee);
}
@Override
public void demarrer() {
System.out.println("La moto démarre avec un bouton");
}
@Override
public void arreter() {
System.out.println("La moto s'arrĂȘte");
}
}
đĄ Points clĂ©s Ă retenir
- Classe abstraite : Ne peut pas ĂȘtre instanciĂ©e, peut contenir des mĂ©thodes abstraites et concrĂštes
- MĂ©thode abstraite : DĂ©clarĂ©e sans implĂ©mentation, doit ĂȘtre implĂ©mentĂ©e par les classes filles
- Implémentation obligatoire : Les classes filles non abstraites doivent implémenter toutes les méthodes abstraites
- Polymorphisme : Les classes abstraites permettent l'utilisation du polymorphisme
- Mot-clé abstract : Utilisé pour déclarer une classe ou une méthode abstraite
- Utilisez des classes abstraites quand vous avez un code commun Ă partager entre plusieurs classes
- Les méthodes abstraites définissent un contrat que les classes filles doivent respecter
- Une classe abstraite peut avoir des méthodes concrÚtes (non abstraites) pour partager du code
- Les classes abstraites sont utiles pour créer des hiérarchies de classes avec des comportements partiels