La Programmation Orientée Objet (POO) est une façon de penser et d'organiser son code autour de "objets" qui représentent des entités du monde réel. En Java, c'est le paradigme fondamental. Ce guide vous explique les 4 piliers avec des analogies concrètes et des exemples de code commentés.

Pourquoi la POO ?

Imaginez que vous construisez un jeu vidéo avec du code procédural classique. Très vite, votre code devient un enchevêtrement de variables globales et de fonctions difficiles à maintenir. La POO résout ce problème en regroupant les données et les comportements dans des classes.

🧩 Modularité

Divisez votre code en modules indépendants, faciles à tester individuellement.

♻️ Réutilisabilité

Une classe bien écrite peut être réutilisée dans plusieurs projets sans réécriture.

🔒 Maintenabilité

Modifiez une classe sans casser le reste du code — les changements sont isolés.

👥 Collaboration

Plusieurs développeurs peuvent travailler sur des classes différentes sans conflit.

1️⃣ Les Classes et les Objets

Une classe est un modèle (blueprint), un objet est une instance de cette classe. Comme un plan d'architecte (classe) et une maison construite (objet).

Exemple concret — imaginez un jeu vidéo :

public class Personnage {
    // Attributs (propriétés)
    String nom;
    int pointsVie;
    int niveau;

    // Méthodes (actions)
    void attaquer() {
        System.out.println(nom + " attaque !");
    }

    void prendresDegats(int degats) {
        pointsVie -= degats;
        System.out.println(nom + " perd " + degats + " PV");
    }
}

// Créer une instance (un objet)
Personnage hero = new Personnage();
hero.nom = "Link";
hero.pointsVie = 100;
hero.attaquer(); // Affiche : Link attaque !

2️⃣ L'Encapsulation

L'encapsulation signifie cacher les détails internes d'une classe. C'est comme une boîte noire : vous savez ce qu'elle fait, mais pas comment à l'intérieur.

Exemple : un compte bancaire. Vous ne voulez pas que quelqu'un puisse modifier directement votre solde. Il doit passer par des méthodes sécurisées.

public class CompteBancaire {
    private double solde; // private = accès interdit de l'extérieur

    // Getter — lire le solde
    public double getSolde() {
        return solde;
    }

    // Méthode sécurisée pour déposer
    public void deposer(double montant) {
        if (montant > 0) {
            solde += montant;
            System.out.println("Dépôt de " + montant + "€ accepté");
        }
    }

    // Méthode sécurisée pour retirer
    public void retirer(double montant) {
        if (montant > 0 && montant <= solde) {
            solde -= montant;
        } else {
            System.out.println("Solde insuffisant !");
        }
    }
}

Avec l'encapsulation, personne ne peut faire compte.solde = -9999 depuis l'extérieur — le compilateur Java refusera. C'est la sécurité du code !

3️⃣ L'Héritage

L'héritage permet à une classe d'hériter des propriétés et méthodes d'une autre. C'est comme la génétique : les enfants héritent des caractéristiques de leurs parents.

Tous les animaux mangent et dorment — pas besoin de réécrire ces méthodes pour chaque animal :

// Classe parente
public class Animal {
    String nom;

    void manger() {
        System.out.println(nom + " est en train de manger");
    }
    void dormir() {
        System.out.println(nom + " dort...");
    }
}

// Classe enfant — hérite de Animal
public class Chien extends Animal {
    void aboyer() {
        System.out.println(nom + " : Wouf wouf !");
    }
}

// Utilisation
Chien monChien = new Chien();
monChien.nom = "Rex";
monChien.manger();  // Hérité de Animal
monChien.aboyer();  // Spécifique à Chien

Le mot-clé extends établit la relation d'héritage. Le Chien est un Animal — c'est la règle "is-a" de la POO.

4️⃣ Le Polymorphisme

Le polymorphisme signifie "plusieurs formes". Une même méthode peut se comporter différemment selon l'objet qui l'appelle.

Imaginez une interface musicale — tous les instruments jouent, mais chacun sonne différemment :

public abstract class Instrument {
    abstract void jouer(); // Chaque instrument joue différemment
}

public class Guitare extends Instrument {
    void jouer() {
        System.out.println("Plin plin plin... 🎸");
    }
}

public class Piano extends Instrument {
    void jouer() {
        System.out.println("Ding ding ding... 🎹");
    }
}

// Le polymorphisme en action
Instrument i1 = new Guitare();
Instrument i2 = new Piano();
i1.jouer(); // Plin plin plin...
i2.jouer(); // Ding ding ding...

Le même appel .jouer() produit des résultats différents selon le type réel de l'objet. C'est la puissance du polymorphisme !

Récapitulatif — Les 4 piliers

📦 Classe / Objet

La classe est le moule, l'objet est l'instance. Regroupez données et comportements ensemble.

🔒 Encapsulation

Cachez les détails internes. Utilisez private et exposez des méthodes publiques contrôlées.

👨‍👦 Héritage

Une classe enfant hérite de la classe parente avec extends. Réutilisez et spécialisez.

🎭 Polymorphisme

Une même méthode, plusieurs comportements selon le type d'objet. Puissant et flexible.

Cas d'usage réels

  • Jeu vidéo : Personnages, ennemis, objets héritent d'une classe Entity avec des propriétés communes (position, santé) et des comportements spécifiques
  • Application web : Utilisateurs, produits, commandes sont des classes avec méthodes CRUD (créer, modifier, supprimer, valider)
  • Application bancaire : Comptes courants et épargne héritent d'une classe Compte abstraite — comme dans mon projet AP3 !
  • Gestion de bibliothèque : Livres, emprunteurs, emprunts — chacun une classe avec ses responsabilités, comme dans mon projet Java Swing