Objets et classes en Java

03 Sep 2019 03 Sep 2019 9934 vues ESSADDOUKI Mostafa
Introduction
1 Nouveautés de Java 11 2 Différences entre JDK, JRE et JVM 3 Structure d'un programme Java - Hello World 4 Mots clés et conventions de dénomination en Java 5 Types de données intégrés en Java 6 Les variables en Java 7 Classes enveloppe - Number, Integer, Double ... 8 Lire les entrées clavier en Java
Structures de contrôle
9 Les opérateurs en Java 10 Les structures conditionnelles en Java 11 Les boucles en Java 12 Instructions de contrôle de boucle - break, continue
Chaines de caractères
13 Les chaines en Java - API String 14 Les chaines en Java - StringBuffer et StringBuilder 15 Les expressions régulières en Java
Programmation OO
16 Objets et classes en Java 17 Modificateurs d'accès Java - public, private, protected et package 18 Méthodes et surcharge des méthodes en Java 19 les constructeurs en Java 20 L'héritage en Java 21 Classes abstraites en Java 22 Interfaces et héritage multiple en Java 23 Les classes imbriquées en Java 24 Les singletons en Java 25 Classes et méthodes génériques 26 Interface fonctionnelle et expressions Lambda en Java
Tableaux et collections
27 Les tableaux en Java 28 Classe Arrays - java.util.Arrays 29 Les listes dynamiques - java.util.ArrayList 30 Les listes chaînées en Java - java.util.LinkedList 31 HashSet en Java - java.util.HashSet 32 HashMap en Java - java.util.HashMap
Gestion des fichiers
33 Comprendre les fichiers informatiques 34 Utilisation des classes Path et Files en Java 35 Lecture et écriture dans un fichier en Java 36 Fichiers à accès aléatoire en Java
Gestion d'exceptions
37 Gestion d'exceptions en Java 38 Créez vos propres classes d'exception en Java
Programmation concurrente
39 Introduction à la programmation concurrente en Java - Multi-threads 40 classe java.lang.Thread 41 Synchronisation des threads en Java

Classes et objets en Java

  Prérequis

Maîtriser les types primitifs, les variables et la structure d'un programme Java. Avoir des notions de base sur la programmation procédurale.

  Objectifs

Comprendre les concepts fondamentaux de la programmation orientée objet en Java : définir une classe, déclarer des attributs et des méthodes, créer des objets avec des constructeurs, et accéder aux membres via l'opérateur point.

  Un peu d'histoire

La Programmation Orientée Objet (POO) est née dans les années 1960 avec le langage Simula. Elle a été popularisée par Smalltalk (1972) puis adoptée massivement par C++, Java et Python. Java a été conçu dès 1995 comme un langage entièrement orienté objet : tout code Java (hors types primitifs) est encapsulé dans des classes.

1. Les piliers de la POO en Java

Concept Description courte
Classe Modèle (plan) décrivant les attributs et comportements d'un type d'objet
Objet Instance concrète d'une classe, possédant un état et des comportements
Encapsulation Regrouper données et méthodes, contrôler l'accès via des modificateurs
Héritage Une classe peut hériter des attributs et méthodes d'une autre classe
Polymorphisme Un même nom de méthode peut avoir des comportements différents selon le contexte
Abstraction Exposer uniquement l'essentiel, cacher les détails d'implémentation
Ce cours en bref Ce cours se concentre sur les deux concepts fondateurs : Classes et Objets. Les autres piliers (héritage, polymorphisme, abstraction) feront l'objet de cours dédiés.

2. La classe — modèle de l'objet

Définition — Classe Une classe est un modèle (ou plan) à partir duquel des objets sont créés. Elle regroupe des attributs (données décrivant l'état) et des méthodes (comportements que l'objet peut exécuter).

2.1 Syntaxe de déclaration

   
Structure d'une classe Java Java
class NomDeLaClasse {

    // ── Attributs (variables d'instance) ──
    typeAttribut nomAttribut;

    // ── Constructeur ──
    NomDeLaClasse() {
        // initialisation
    }

    // ── Méthodes ──
    typeRetour nomMethode() {
        // instructions
    }
}

  Exemple 1 — Classe Lampe

class Lampe {

    // Attribut (variable d'instance)
    private boolean isOn;

    // Méthode — allumer la lampe
    public void allumer() {
        isOn = true;
    }

    // Méthode — éteindre la lampe
    public void eteindre() {
        isOn = false;
    }
}

2.2 Les trois types de variables dans une classe

Type de variable Déclaration Durée de vie Accessibilité
Variable locale Dans une méthode, un constructeur ou un bloc Détruite à la fin de la méthode Uniquement dans ce bloc
Variable d'instance Dans la classe, hors de toute méthode Tant que l'objet existe Toutes les méthodes de la classe
Variable de classe Dans la classe avec le mot-clé static Toute la durée de l'application Partagée entre toutes les instances

  Exemple 2 — Les trois types de variables

class Compteur {

    // Variable de classe (partagée par tous les objets)
    static int nombreInstances = 0;

    // Variable d'instance (propre à chaque objet)
    private int valeur;

    public void incrementer() {
        // Variable locale (existe seulement dans cette méthode)
        int pas = 1;
        valeur += pas;
    }
}

2.3 Les modificateurs d'accès

Définition — Modificateur d'accès Un modificateur d'accès contrôle la visibilité d'un attribut ou d'une méthode depuis d'autres classes. Java en propose quatre niveaux.
Modificateur Même classe Même package Sous-classe Partout
private
(aucun)
protected
public
Bonne pratique — Encapsulation Déclarez toujours les attributs private et fournissez des méthodes public (getters / setters) pour y accéder. C'est le principe d'encapsulation — protéger l'état interne de l'objet.

3. Les constructeurs

Définition — Constructeur Un constructeur est une méthode spéciale appelée automatiquement lors de la création d'un objet avec new. Il porte le même nom que la classe et n'a pas de type de retour. Son rôle est d'initialiser l'état de l'objet.
Règles des constructeurs
  • Le nom du constructeur doit être identique au nom de la classe.
  • Un constructeur n'a pas de type de retour (même pas void).
  • Si aucun constructeur n'est défini, Java génère automatiquement un constructeur par défaut (sans paramètre).
  • Une classe peut avoir plusieurs constructeurs (surcharge).

  Exemple 3 — Constructeurs et mot-clé this

class Lampe {

    private boolean isOn;

    // Constructeur par défaut — lampe éteinte
    public Lampe() {
        this.isOn = false;
        System.out.println("Constructeur par défaut appelé");
    }

    // Constructeur d'initialisation — état défini par le paramètre
    public Lampe(boolean etat) {
        this.isOn = etat;
        System.out.println("Constructeur d'initialisation appelé");
    }

    public static void main(String[] args) {
        Lampe l1 = new Lampe();        // appelle le 1er constructeur
        Lampe l2 = new Lampe(true);    // appelle le 2nd constructeur
    }
}
Sortie
Constructeur par défaut appelé
Constructeur d'initialisation appelé
Mot-clé this Dans un constructeur ou une méthode, this fait référence à l'objet courant. Il est indispensable quand un paramètre porte le même nom qu'un attribut : this.isOn désigne l'attribut, isOn seul désignerait le paramètre.

4. Les objets en Java

Définition — Objet Un objet est une instance concrète d'une classe. Il possède son propre état (valeurs des attributs) et expose des comportements (méthodes). En Java, les objets sont créés avec le mot-clé new.

4.1 Les trois étapes de création d'un objet

Étape Rôle Exemple
1 — Déclaration Déclarer une variable référence du type de la classe Lampe l1;
2 — Instanciation Allouer la mémoire avec new new Lampe()
3 — Initialisation Appeler le constructeur pour initialiser l'objet l1 = new Lampe();
   
Création d'un objet Java
// Les trois étapes en une ligne
NomClasse nomObjet = new NomClasse(argumentsConstructeur);

4.2 Accès aux membres via l'opérateur point

Opérateur point . L'opérateur point permet d'accéder aux attributs et méthodes d'un objet : objet.attribut ou objet.methode().

  Exemple 4 — Création et utilisation d'objets

class Lampe {

    private boolean isOn;

    public Lampe() {
        this.isOn = false;
    }

    public void allumer() {
        isOn = true;
        System.out.println("Lampe allumée");
    }

    public void eteindre() {
        isOn = false;
        System.out.println("Lampe éteinte");
    }

    public boolean getEtat() {
        return isOn;
    }

    public static void main(String[] args) {
        // Création de deux objets distincts
        Lampe l1 = new Lampe();
        Lampe l2 = new Lampe();

        // Chaque objet a son propre état
        l1.allumer();
        System.out.println("l1 allumée ? " + l1.getEtat()); // true
        System.out.println("l2 allumée ? " + l2.getEtat()); // false

        l1.eteindre();
    }
}
Sortie
Lampe allumée
l1 allumée ? true
l2 allumée ? false
Lampe éteinte
Indépendance des objets Chaque objet possède sa propre copie des attributs d'instance. Modifier l1.isOn n'affecte pas l2.isOn. Les deux objets partagent la même définition (classe) mais ont des états distincts.

5. Packages et instructions d'importation

Définition — Package Un package est un espace de noms qui regroupe des classes et interfaces liées. Il évite les conflits de nommage et organise le code en modules cohérents.
Définition — Import L'instruction import indique au compilateur où trouver les classes utilisées dans le fichier source, sans avoir à écrire leur nom complet à chaque fois.
// Importer une classe spécifique
import java.util.ArrayList;

// Importer toutes les classes d'un package
import java.io.*;

// Structure complète d'un fichier source
package ma.mp.cpge;          // 1. déclaration du package

import java.util.ArrayList;    // 2. imports

public class Etudiant {        // 3. déclaration de la classe
    // ...
}
Règles de déclaration d'un fichier source Java
  1. Un seul fichier source peut contenir une seule classe publique.
  2. Le nom de la classe publique doit correspondre exactement au nom du fichier (.java).
  3. L'instruction package doit être la première ligne (avant tout import).
  4. Les instructions import viennent après le package et avant la déclaration de classe.
  5. Un fichier peut contenir plusieurs classes non publiques.

  Exemple 5 — Structure complète d'un fichier source

// 1. Package
package ma.mp.cpge.poo;

// 2. Imports
import java.util.ArrayList;
import java.util.List;

// 3. Classe publique (nom = nom du fichier : Ecole.java)
public class Ecole {

    // Variable de classe
    private static String nom = "MP";

    // Variable d'instance
    private List<String> etudiants;

    // Constructeur
    public Ecole() {
        this.etudiants = new ArrayList<>();
    }

    // Méthode
    public void ajouterEtudiant(String prenom) {
        etudiants.add(prenom);
        System.out.println(prenom + " ajouté(e) à " + nom);
    }

    public static void main(String[] args) {
        Ecole e = new Ecole();
        e.ajouterEtudiant("Mostafa");
        e.ajouterEtudiant("Sara");
    }
}
Sortie
Mostafa ajouté(e) à MP
Sara ajouté(e) à MP

6. Exercice

Modéliser un compte bancaire

Niveau : Débutant

On souhaite modéliser un compte bancaire simplifié. Un compte possède un titulaire (nom), un numéro de compte et un solde. Il peut recevoir des dépôts, des retraits et afficher son état.

Travail demandé

  1. Créer une classe CompteBancaire avec les attributs : titulaire (String), numero (String), solde (double).
  2. Écrire un constructeur d'initialisation prenant les trois valeurs en paramètre.
  3. Écrire une méthode deposer(double montant) qui ajoute le montant au solde (vérifier que le montant est positif).
  4. Écrire une méthode retirer(double montant) qui soustrait le montant (vérifier que le solde est suffisant).
  5. Écrire une méthode afficherEtat() qui affiche toutes les informations du compte.
  6. Dans le main, créer deux comptes et simuler quelques opérations.
Exemple de sortie attendue
Sortie
=== Compte de Mostafa ===
Numéro : 23123123123
Solde  : 1500.0 MAD
Dépôt de 500.0 MAD effectué.
Retrait de 200.0 MAD effectué.
Solde insuffisant pour retirer 2000.0 MAD.
=== Compte de Mostafa ===
Numéro : 23123123123
Solde  : 1800.0 MAD
Contraintes
  • Tous les attributs doivent être private
  • Un retrait refusé affiche un message d'erreur sans modifier le solde
  • Un dépôt de montant négatif ou nul est ignoré avec un message

  L'essentiel en bref

En Java, une classe est un modèle regroupant des attributs (état) et des méthodes (comportements). Un objet est une instance de classe créée avec new, possédant son propre état indépendant. Le constructeur — portant le nom de la classe — initialise l'objet à la création ; une classe peut en avoir plusieurs (surcharge). L'accès aux membres se fait via l'opérateur point (.). Les attributs sont généralement déclarés private (encapsulation) et les méthodes public. Les packages organisent les classes en namespaces, et les imports permettent d'utiliser des classes externes sans écrire leur chemin complet.