Classes abstraites en Java

Les classes abstraites sont des élémants clés de la programmation orientée objet en Java. Elles permettent de créer des modèles incomplets qui obligent les classes dérivées à implémenter certaines fonctionnalités, tout en offrant la possibilité de définir des logiques partagées.

Une classe abstraite est déclarée avec le mot-clé abstract. Elle ne peut pas être instanciée directement et peut contenir des méthodes abstraites (sans corps) ainsi que des méthodes concrètes (implémentées).

Voici quelques caractéristiques fondamentales des classes abstraites :

  • Non instanciable : Il est impossible de créer un objet directement à partir d'une classe abstraite.
  • Méthodes abstraites : Ces méthodes n'ont pas de corps et doivent être implémentées par les classes filles.
  • Structure mixte : Elles peuvent inclure des méthodes concrètes, des variables membres, des constructeurs, des méthodes statiques et des méthodes finales.

Voici un exemple pratique illustrant l'utilisation des classes abstraites dans un scénario de simulation animale :

abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    // Méthode abstraite
    public abstract void makeNoise();

    // Méthode concrète
    public void feed() {
        System.out.println(name + " mange...");
    }
}

class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    @Override
    public void makeNoise() {
        System.out.println("Miaou !");
    }
}

// Classe de test
public class Test {
    public static void main(String[] args) {
        Animal monChat = new Cat("Whiskers");
        monChat.feed();      // Affiche : Whiskers mange...
        monChat.makeNoise(); // Affiche : Miaou !
    }
}

Un autre exemple montre comment utiliser une classe abstraite pour implémenter le modèle de méthode (template method) :

abstract class Game {
    // Méthode de template (définie comme final)
    public final void start() {
        initialize();
        playGame();
        finish();
    }

    abstract void initialize();
    abstract void playGame();

    // Implémentation par défaut
    void finish() {
        System.out.println("Partie terminée !");
    }
}

En comparaison avec les interfaces, les classes abstraites présentent plusieurs différences importantes :

Caractéristique Classe abstraite Interface
Implémentation de méthodes Peut avoir des méthodes concrètes Par défaut, les méthodes sont abstraites
Types de variables N'importe quel type Par défaut, public static final
Héritage multiple Non supporté Supporté
Constructeur Disponible Non disponible
Utilisation Pour des relations "est un" Pour des capacités "a un"

Voici quelques bonnes pratiques lors de l'utilisation des classes abstraites :

  1. Réutiliser du code entre plusieurs classes liées.
  2. Imposer des méthodes spécifiques aux classes dérivées.
  3. Encapsuler des parties fixes de logique, comme dans le modèle de méthode.
  4. Gérer la compatibilité entre versions sans perturber le code existant.

Quelquse points à garder à l'esprit :

  1. Une classe abstraite peut avoir une méthode main.
  2. Si une classe fille ne fournit pas toutes les méthodes abstraites, elle doit également être déclarée abstraite.
  3. Les méthodes abstraites ne peuvent pas être privées, finales ou statiques.
  4. À partir de Java 8, les interfaces peuvent avoir des méthodes par défaut, ce qui nécessite une analyse soigneuse avant de choisir entre une interface et une classe abstraite.

Étiquettes: Java Programmation orientée objet Classes Abstraites méthodes abstraites modèle de méthode

Publié le 3 septembre à 18h54