Concepts Intermédiaires de la Programmation Orientée Objet en Java

Optimisation du workflow dans IntelliJ IDEA

Pour gagner en efficacité lors du développement Java, la maîtrise des raccourcis clavier est essentielle :

  • Ctrl + D : Dupliquer la ligne actuelle.
  • Ctrl + Y : Supprimer la ligne.
  • Alt + Entrée : Suggestions de correction et importations automatiques.
  • Ctrl + Alt + L : Réindenter et formater le code selon les standards.
  • Alt + Insert : Générer automatiquement des constructeurs, getters, setters ou méthodes toString().
  • Ctrl + H : Afficher la hiérarchie de classes.

Gestion des Paquetages (Packages)

Les paquets servent à organiser les classses, à éviter les conflits de noms et à gérer les niveaux de visibilité.

Syntaxe et nomenclature

Un paquet se déclare au tout début du fichier source :

package fr.entreprise.projet.module;

La convention veut que l'on utilise le nom de domaine inversé de l'organisation. Par exemple, com.google.search.

Importation de classes

Pour utiliser une classe située dans un autre paquetage, on utilise le mot-clé import :

import java.util.ArrayList; // Import spécifique
import java.util.*;         // Import de tout le paquetage (non recommandé)

Modificateurs d'accès

Java propose quatre niveaux de visibilité pour contrôler l'accès aux données :

Modificateur Classe Package Sous-classe Monde
public Oui Oui Oui Oui
protected Oui Oui Oui Non
(Défaut) Oui Oui Non Non
private Oui Non Non Non

L'Encapsulation

L'encapsulation consiste à protéger l'état interne d'un objet en masquant ses attributs et en n'autorisant l'accès que via des méthodes publiques.

Mise en œuvre

  1. Déclarer les attributs en private.
  2. Créer des méthodes public setXxx() pour modifier les valeurs avec validation.
  3. Créer des méthodes public getXxx() pour lire les valeurs.
class CompteBancaire {
    private double solde;

    public void deposer(double montant) {
        if (montant > 0) {
            this.solde += montant;
        } else {
            System.out.println("Montant invalide");
        }
    }

    public double getSolde() {
        return solde;
    }
}

L'Héritage

L'héritage permet de créer une nouvelle classe à partir d'une classe existante pour réutiliser du code et établir une hiérarchie "est-un".

Syntaxe et règles

class Vehicule {
    public void rouler() {
        System.out.println("Le véhicule se déplace");
    }
}

class Voiture extends Vehicule {
    // Hérite de rouler()
}
  • Java ne supporte que l'héritage simple (une seule classe parente directe).
  • Toute classe hérite implicitement de la classe Object.
  • Le constructeur de la classe fille appelle par défaut le constructeur sans argument de la classe parente.

Le mot-clé super

super fait référence à l'instance de la classe parente. Il est utilisé pour :

  • Appeler un constructeur spécifique du parent : super(args).
  • Accéder à une méthode ou un attribut du parent masqué par une redéfinition.

Redéfinition de méthodes (Override)

La redéfinition permet à une classe fille de fournir une implémentation spécifique d'une méthode déjà définie dans sa classe parente.

class Animal {
    public void emettreSon() {
        System.out.println("Son d'animal");
    }
}

class Chat extends Animal {
    @Override
    public void emettreSon() {
        System.out.println("Miaou");
    }
}

Différence avec la surcharge (Overload) : La surcharge utilise le même nom de méthode mais avec des signatures de paramètres différentes dans la même classe.

Le Polymorphisme

Le polymorphisme permet d'utiliser un objet sous plusieurs formes. Un objet d'une classe fille peut être référencé par une variable du type de la classe parente.

Upcasting et Downcasting

// Upcasting : automatique et sûr
Animal monChat = new Chat(); 

// Downcasting : nécessite un cast explicite et une vérification
if (monChat instanceof Chat) {
    Chat vraiChat = (Chat) monChat;
    vraiChat.ronronner();
}

Mécanisme de liaison dynamique

En Java, lors de l'appel d'une méthode sur un objet polymorphe, c'est la méthode de la classe de l'instance réelle (type d'exécution) qui est appelée, et non celle du type de référence.

La classe Object

Toutes les classes en Java héritent de java.lang.Object. Voici les méthodes clés à redéfinir :

  • equals(Object obj) : Compare le contenu de deux objets plutôt que leurs adresses mémoire.
  • hashCode() : Retourne une valeur entière unique pour l'objet, utilisée dans les structures de données comme HashMap.
  • toString() : Retourne une représentation textuelle de l'objet.

Débogage (Debug)

Le débogage permet de suivre l'exécution du programme ligne par ligne pour identifier les erreurs logiques.

  • Point d'arrêt (Breakpoint) : Cliquez dans la marge pour stopper l'exécution.
  • Step Over (F8) : Exécute la ligne suivante sans entrer dans les méthodes.
  • Step Into (F7) : Entre à l'intérieur de la méthode appelée.
  • Resume (F9) : Continue l'exécution jusqu'au prochain point d'arrêt.

Étude de cas : Système de Gestion Budgétaire (version POO)

Voici une implémentation simplifiée d'un outil de suivi de dépenses en utilisant les principes de la POO :

class Transaction {
    private String libelle;
    private double montant;

    public Transaction(String libelle, double montant) {
        this.libelle = libelle;
        this.montant = montant;
    }

    @Override
    public String toString() {
        return libelle + " : " + montant + " €";
    }
}

class Portefeuille {
    private double soldeTotal;
    private List<Transaction> historique = new ArrayList<>();

    public void ajouterRevenu(double montant) {
        if (montant > 0) {
            soldeTotal += montant;
            historique.add(new Transaction("Revenu", montant));
        }
    }

    public void effectuerDepense(String description, double montant) {
        if (montant <= soldeTotal) {
            soldeTotal -= montant;
            historique.add(new Transaction(description, -montant));
        } else {
            System.out.println("Fonds insuffisants");
        }
    }

    public void afficherEtat() {
        System.out.println("Solde actuel : " + soldeTotal + " €");
        historique.forEach(System.out::println);
    }
}

Étiquettes: Java OOP encapsulation Héritage polymorphisme

Publié le 10 juin à 01h58