Organisez votre code avec les bases de la programmation orientée objet

Dans les chapitres précédents, vous avez écrit du code Java dans une classeMain, avec des variables, des conditions, des boucles et des méthodes. Dans ce chapitre, vous allez voir comment Java permet d’organiser ces éléments autour d’objets. L’objectif est de comprendre la structure la plus fréquente d’un code Java simple : une classe qui décrit un type d’élément, puis des objets créés à partir de cette classe.

Vous allez continuer avec un exemple de produit. Un produit peut avoir un nom, un prix et un stock. Au lieu de manipuler ces informations séparément, vous allez apprendre à les regrouper dans une classeProduct.

Créez une classe pour représenter une information

Une classe sert à décrire une forme d’objet. Elle indique quelles informations l’objet peut contenir et quelles actions il peut proposer. Par exemple, si vous voulez représenter un produit, vous pouvez créer une classeProduct:

public class Product {
    String name;
    double price;
    int stock;
}

Cette classe ne crée pas encore un produit précis. Elle décrit seulement ce qu’un produit peut contenir : un nom, un prix et un stock.

Dans cet exemple :

  • Productest le nom de la classe ;

  • String,doubleetintsont les types des attributs ;

  • name,priceetstocksont des attributs ;

  • les accolades{ }délimitent le contenu de la classe.

Chaque attribut est écrit avec deux éléments : d’abord son type, puis son nom. Par exemple, dansString name,Stringindique que l’information est un texte etnameindique que cette information correspond au nom du produit. De la même manière,double pricedécrit un prix sous forme de nombre décimal, etint stockdécrit un stock sous forme de nombre entier.

Créez un objet à partir d’une classe

Une fois la classe écrite, vous pouvez créer un objet. Par exemple, dans une classeMain, vous pouvez créer un produit :

public class Main {
    public static void main(String[] args) {
        Product product = new Product();

        product.name = "Sac à dos";
        product.price = 45.90;
        product.stock = 12;

        System.out.println(product.name);
    }
}

La ligne suivante crée un nouvel objetProduct:

Product product = new Product();

Vous pouvez la lire ainsi : crée un objet de typeProduct, puis garde cet objet dans une variable appeléeproduct.

Les lignes suivantes remplissent les informations de cet objet :

product.name = "Sac à dos";
product.price = 45.90;
product.stock = 12;

Le point.permet d’accéder à un élément de l’objet. Ici,product.namedésigne l’attributnamede l’objetproduct.

Quand le programme affiche :

System.out.println(product.name);

la console affiche :

Sac à dos

Initialisez un objet avec un constructeur

Dans l’exemple précédent, vous avez créé un objet, puis vous avez rempli ses attributs en plusieurs lignes. Cela fonctionne, mais cette écriture sépare deux actions qui vont souvent ensemble : créer le produit et lui donner ses informations de départ.

Voici l’exemple complet, avec une classeProductet une classeMain:

public class Product {
    String name;
    double price;
    int stock;

    public Product(String name, double price, int stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }
}

public class Main {
    public static void main(String[] args) {
        Product product = new Product("Sac à dos", 45.90, 12);

        System.out.println(product.name);
    }
}

Commencez par observer le résultat attendu. Ce programme crée un produit, puis affiche son nom dans la console :

Sac à dos

Pour comprendre comment Java arrive à ce résultat, partez de la ligne qui crée le produit :

Product product = new Product("Sac à dos", 45.90, 12);

Cette ligne crée un objet de typeProductet le garde dans une variable appeléeproduct. Les valeurs"Sac à dos",45.90et12sont données au moment de la création de l’objet.

Ces valeurs sont reçues par ce bloc de code dans la classeProduct:

public Product(String name, double price, int stock) {
    this.name = name;
    this.price = price;
    this.stock = stock;
}

Ce bloc s’appelle un constructeur. Il porte le même nom que la classe :Product. Son rôle est d’initialiser l’objet, c’est-à-dire de remplir ses attributs avec des valeurs de départ.

Regardez maintenant la première ligne à l’intérieur du constructeur :

this.name = name;

À droite,namecorrespond à la valeur reçue par le constructeur, ici"Sac à dos". À gauche,this.namecorrespond à l’attributnamede l’objet en cours de création. La ligne place donc"Sac à dos"dans l’attributnamedu produit.

La même logique s’applique aux deux autres lignes :

  • this.price = price;place45.90dans l’attributprice;

  • this.stock = stock;place12dans l’attributstock.

Une fois l’objet créé et initialisé, vous pouvez utiliser ses informations :

System.out.println(product.name);

Cette ligne affiche l’attributnamede l’objetproduct. Comme cet attribut contient"Sac à dos", la console afficheSac à dos.

Ajoutez une méthode dans une classe

Une classe ne sert pas seulement à stocker des informations. Elle peut aussi contenir des méthodes liées à ces informations. Par exemple, un produit peut indiquer s’il est disponible :

public class Product {
    String name;
    double price;
    int stock;

    public Product(String name, double price, int stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }

    public boolean isAvailable() {
        return stock > 0;
    }
}

La méthodeisAvailableutilise l’attributstockde l’objet. Si le stock est supérieur à0, elle retournetrue. Sinon, elle retournefalse.

Vous pouvez appeler cette méthode depuismain:

public class Main {
    public static void main(String[] args) {
        Product product = new Product("Sac à dos", 45.90, 12);

        System.out.println(product.isAvailable());
    }
}

La console affiche :

true

La ligne suivante appelle la méthodeisAvailablesur l’objetproduct:

product.isAvailable()

Protégez les attributs avec l’encapsulation

Dans les exemples précédents, les attributs sont accessibles directement avecproduct.nameouproduct.stock. Pour un premier exemple, cela permet de comprendre facilement le lien entre objet et attribut. Mais dans un code Java plus organisé, on évite souvent de modifier les attributs directement depuis l’extérieur de la classe. Cela permet de garder le contrôle sur les valeurs autorisées. Par exemple, le stock d’un produit ne devrait pas devenir négatif par erreur.

Pour éviter ce type de modification directe, vous pouvez rendre les attributsprivate:

public class Product {
    private String name;
    private double price;
    private int stock;

    public Product(String name, double price, int stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }

    public boolean isAvailable() {
        return stock > 0;
    }
}

Le motprivatesignifie que l’attribut est accessible seulement à l’intérieur de la classe. Cela évite qu’une autre partie du programme modifie directement les informations de l’objet sans passer par une méthode prévue pour cela.

Si vous avez besoin de lire une information depuis l’extérieur, vous pouvez ajouter une méthode dédiée :

public String getName() {
    return name;
}

Vous pouvez ensuite l’utiliser ainsi :

System.out.println(product.getName());

Cette méthode s’appelle souvent un getter. Son rôle est simple : donner accès à une information sans permettre de la modifier directement.

Utilisez plusieurs objets

Une fois que vous savez créer un objet, vous pouvez en créer plusieurs à partir de la même classe. Chaque objet a ses propres valeurs :

public class Main {
    public static void main(String[] args) {
        Product backpack = new Product("Sac à dos", 45.90, 12);
        Product notebook = new Product("Carnet", 4.50, 0);

        System.out.println(backpack.getName());
        System.out.println(notebook.getName());
    }
}

La classeProductdécrit une structure commune. Les objetsbackpacketnotebooksont deux produits différents. Ils ont le même type, mais pas les mêmes valeurs.

Vous pouvez aussi placer plusieurs objets dans uneList:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Product> products = new ArrayList<>();

        products.add(new Product("Sac à dos", 45.90, 12));
        products.add(new Product("Carnet", 4.50, 0));

        for (Product product : products) {
            System.out.println(product.getName());
        }
    }
}

La liste contient ici des objetsProduct. La boucle parcourt les produits un par un, puis affiche leur nom.

Aller plus loin : découvrez lesrecord

Java propose aussi une syntaxe plus courte pour représenter certaines données simples : lesrecord. Unrecordpermet de créer une structure principalement destinée à transporter des informations, avec moins de code qu’une classe classique.

Par exemple :

public record Product(String name, double price, int stock) {
}

Cette syntaxe peut être pratique pour des objets simples qui contiennent surtout des données. Vous n’avez pas besoin de l’utiliser dans ce cours : commencez par bien comprendre la classe, les attributs, le constructeur et les méthodes.

À vous de jouer

Votre équipe veut représenter chaque plat de l’application par un objet, avec ses informations (nom, prix, disponibilité) et sa propre façon de se décrire. Voici le squelette à compléter :

public class Dish {
    // Étape 1 : déclarez ici 3 attributs privés :
    //   - name (String)
    //   - price (double)
    //   - available (boolean)

    // Étape 2 : écrivez le constructeur Dish(name, price, available)

    // Étape 3 : écrivez la méthode describe() qui retourne un String
}

public class Main {
    public static void main(String[] args) {
        // Étape 4 : créez 2 objets Dish et affichez leur description
    }
}

Votre mission :

  1. Complétez la classeDishavec 3 attributsprivate(name,price,available), un constructeur qui reçoit les 3 valeurs, et une méthodedescribe()qui retourne unStringau formatPizza (12.0 €) - disponible(ou- indisponiblesiavailablevautfalse).

  2. Dansmain, créez deux plats : unePizzaà12.0 €disponible, unTiramisuà6.0 €indisponible. Appelezdescribe()sur chacun et affichez le résultat.

En résumé

  • Une classe décrit une structure ; un objet est un élément concret créé à partir de cette structure.

  • Les attributs stockent les informations d’un objet, comme un nom, un prix ou un stock.

  • Un constructeur initialise un objet, c’est-à-dire qu’il lui donne ses premières valeurs.

  • Une méthode placée dans une classe peut utiliser les attributs de l’objet.

  • L’encapsulation protège les attributs avecprivateet donne accès aux informations avec des méthodes dédiées.

Vous savez maintenant organiser des informations et des comportements simples dans des classes Java. Dans le dernier chapitre, vous allez lire une structure de code existante, manipuler des données dans un fichier et gérer des erreurs simples.

Et si vous obteniez un diplôme OpenClassrooms ?
  • Formations jusqu’à 100 % financées
  • Date de début flexible
  • Projets professionnalisants
  • Mentorat individuel
Trouvez la formation et le financement faits pour vous