Classes et objets

Première leçon du cours Java orienté objet, en accès libre : environ 20 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Définir une classe avec attributs, constructeur et méthodes
  • Créer des objets avec new et appeler leurs méthodes
  • Comprendre this, les références et null

ClassesObjets et référencesConstructeurs

Dans le cours précédent, toutes vos méthodes étaient static et les données circulaient en paramètres. La programmation orientée objet (POO) regroupe au même endroit des données et les opérations qui les manipulent.

  • Une classe est un modèle : « un compte bancaire a un titulaire et un solde ; on peut y déposer et retirer de l’argent ».
  • Un objet est un exemplaire concret construit à partir de ce modèle : le compte d’Ada, le compte de Linus.

Déclarer une classe

class CompteBancaire {
    // Attributs (état de chaque objet)
    String titulaire;
    int solde;               // en euros pour simplifier

    // Constructeur : même nom que la classe, pas de type de retour
    CompteBancaire(String titulaire, int soldeInitial) {
        this.titulaire = titulaire;     // this.titulaire = attribut ; titulaire = paramètre
        this.solde = soldeInitial;
    }

    // Méthodes d'instance (pas de static) : elles agissent sur CET objet
    void deposer(int montant) {
        solde += montant;
    }

    boolean retirer(int montant) {
        if (montant > solde) {
            return false;               // refus : solde insuffisant
        }
        solde -= montant;
        return true;
    }

    @Override
    public String toString() {
        return "Compte de " + titulaire + " : " + solde + " EUR";
    }
}

Créer et utiliser des objets

public class Main {
    public static void main(String[] args) {
        CompteBancaire a = new CompteBancaire("Ada", 100);   // new appelle le constructeur
        CompteBancaire b = new CompteBancaire("Linus", 20);
        a.deposer(50);
        boolean ok = b.retirer(30);           // false
        System.out.println(a);                // Compte de Ada : 150 EUR (toString appelé)
        System.out.println(b.solde);          // 20
    }
}

Chaque objet possède ses propres valeurs d’attributs : déposer sur a ne change rien à b. Plusieurs classes peuvent cohabiter dans un même fichier, mais une seule peut être public et elle doit porter le nom du fichier. Si vous lancez le fichier directement avec java Main.java, placez la classe Main en premier : le lanceur de Java (y compris Java 25) exécute la première classe déclarée dans le fichier. Dans un vrai projet, chaque classe a son propre fichier.

Constructeurs multiples

CompteBancaire(String titulaire) {
    this(titulaire, 0);       // appelle l'autre constructeur
}

Si vous n’écrivez aucun constructeur, Java fournit un constructeur sans paramètre ; dès que vous en écrivez un, ce constructeur par défaut disparaît.

Références et null

Une variable de type classe ne contient pas l’objet lui-même mais une référence vers lui :

CompteBancaire c = a;      // c et a désignent le MÊME objet
c.deposer(10);
System.out.println(a.solde);  // 160 : modifié via c

CompteBancaire d = null;   // aucune référence
d.deposer(5);              // NullPointerException à l'exécution !

C’est pour cela que == entre deux objets compare les références, et non le contenu (nous verrons equals à la leçon 5).

toString()

Toute classe hérite d’une méthode toString() qui affiche par défaut quelque chose comme CompteBancaire@6d06d69c. La redéfinir (annotation @Override) rend l’affichage et le débogage beaucoup plus agréables.

Dans cette première leçon, les attributs sont accessibles directement (b.solde). C’est pratique mais dangereux : rien n’empêche d’écrire b.solde = -1000. La leçon suivante règle ce problème avec l’encapsulation.

Exercices

Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.

  1. CodeDifficulté 1Sandbox serveur2 indices

    Une classe Rectangle

    Créez une classe Rectangle avec deux attributs double largeur et hauteur, un constructeur, les méthodes aire() et perimetre(), et un toString() qui renvoie Rectangle 3.00 x 4.00. Dans main, lisez largeur et hauteur puis affichez :

    Rectangle 3.00 x 4.00
    Aire : 12.00
    Périmètre : 14.00

    Formatez avec String.format(Locale.ROOT, "%.2f", ...) et lisez les nombres avec Double.parseDouble(sc.next()).

    import java.util.Locale;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
        }
    }
    
    class Rectangle {
        // À compléter
    }
  2. CodeDifficulté 2Sandbox serveur2 indices

    Opérations sur un compte

    Créez la classe CompteBancaire de la leçon (titulaire, solde entier, deposer, retirer qui renvoie false si le solde est insuffisant ou le montant négatif, toString). Le programme lit :

    • une première ligne : le titulaire ;
    • puis des lignes D montant (dépôt) ou R montant (retrait) jusqu’à la fin de l’entrée.

    Pour chaque retrait refusé, affichez Refusé : <montant>. À la fin, affichez Compte de <titulaire> : <solde> EUR. Le solde initial est 0.

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String titulaire = sc.nextLine().trim();
        }
    }
    
    class CompteBancaire {
    }
  3. QCMDifficulté 21 indice

    Références

    Après CompteBancaire a = new CompteBancaire("Ada", 100); CompteBancaire c = a; c.deposer(50);, que vaut a.solde ?

    • 100
    • 150
    • 50

Quiz de fin de leçon

  1. Que fait le mot-clé new ?

    • Déclare une classe
    • Crée un objet et appelle son constructeur
    • Crée une variable static
  2. Dans un constructeur, que désigne this.nom ?

    • Le paramètre nom
    • L'attribut nom de l'objet en cours de construction
    • Une variable globale
  3. Que se passe-t-il en appelant une méthode sur une variable qui vaut null ?

    • La méthode renvoie null
    • Une NullPointerException est levée
    • Rien

La suite du cours

  1. Encapsulation, immutabilité et records20 min
  2. Héritage, classes abstraites et polymorphisme20 min
  3. Interfaces, types scellés et pattern matching20 min
  4. La classe Object : equals, hashCode, toString et membres static20 min
  5. Génériques et composition : concevoir un modèle objet20 min

Java orienté objet · Intermédiaire · 4 h