Public, protected, private et package-private en Java : analyse complète

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Que cachent les modificateurs d'accès en Java ? Plongée dans l'encapsulation

\n\n

Quiconque a commencé à étudier Java a rencontré les mots mystérieux public, private et protected devant les champs et les méthodes. Mais que signifient-ils réellement ? Pourquoi ne peut-on pas simplement tout mettre en public et vivre tranquille ? Et qu'est-ce que ce mystérieux package-private, dont on ne parle pas dans la plupart des tutoriels ?

\n\n

Dans cet article, nous analyserons la différence entre public, protected, package-private et private en Java avec des exemples concrets de code. Vous apprendrez comment fonctionne chaque modificateur, dans quelles situations les utiliser, et pourquoi le bon choix du modificateur d'accès est un signe de bonne pensée architecturale. C'est parti !

\n\n

Pourquoi les modificateurs d'accès sont-ils nécessaires ?

\n\n

Imaginez que vous construisez une maison. Vous avez une porte d'entrée (accessible à tous), une chambre d'amis (accessible aux amis), un bureau personnel (réservé à la famille) et un coffre-fort (réservé à vous seul). Les modificateurs d'accès en Java fonctionnent exactement de la même manière : ils déterminent qui peut « entrer » dans votre classe, méthode ou champ.

\n\n

L'objectif principal est l'encapsulation. Nous cachons les détails internes d'implémentation de la classe et n'exposons à l'extérieur que ce qui est vraiment nécessaire. Cela protège les données contre les modifications accidentelles et simplifie la maintenance du code.

\n\n

Aperçu des quatre niveaux d'accès

\n\n

En Java, il existe quatre niveaux d'accès (du plus restrictif au plus ouvert) :

\n\n
    \n
  • private — accès uniquement à l'intérieur de la classe
  • \n
  • package-private (par défaut) — accès à l'intérieur de la classe et du paquetage
  • \n
  • protected — classe + paquetage + classes dérivées
  • \n
  • public — accès depuis n'importe où
  • \n
\n\n

Private : « À moi, et à personne d'autre »

\n\n

Le modificateur private est le plus restrictif. Un champ ou une méthode marqué comme private est accessible uniquement à l'intérieur de la même classe. Ni les classes dérivées, ni les classes du même paquetage ne peuvent y accéder.

\n\n
public class BankAccount {\n    private double balance;  // Accessible uniquement à l'intérieur de la classe\n\n    public BankAccount(double initialBalance) {\n        this.balance = initialBalance;\n    }\n\n    public void deposit(double amount) {\n        if (amount > 0) {\n            balance += amount;\n        }\n    }\n\n    // Cette méthode voit le champ private car elle est à l'intérieur de la classe\n    public double getBalance() {\n        return balance;\n    }\n}\n\npublic class Main {\n    public static void main(String[] args) {\n        BankAccount account = new BankAccount(1000);\n        // account.balance = 5000;  // Erreur de compilation ! balance est private\n        System.out.println(account.getBalance());  // Fonctionne via la méthode publique\n    }\n}
\n\n

Quand l'utiliser : pour les données internes de la classe qui ne doivent pas être modifiées de l'extérieur (par exemple, un compteur, l'état interne d'un objet).

\n\n

Package-private (default) : « Le voisin silencieux »

\n\n

Si vous n'avez spécifié aucun modificateur, Java rend automatiquement l'accès package-private. Cela signifie que le champ ou la méthode est visible par toutes les classes à l'intérieur du même paquetage, mais pas en dehors.

\n\n
package com.pythonlib.utils;\n\nclass Helper {  // Classe package-private (sans modificateur)\n    String secretMessage = "Visible uniquement à l'intérieur du paquetage";  // Champ package-private\n\n    void displayMessage() {  // Méthode package-private\n        System.out.println(secretMessage);\n    }\n}\n\npackage com.pythonlib.app;\n\nimport com.pythonlib.utils.Helper;\n\npublic class App {\n    public static void main(String[] args) {\n        Helper helper = new Helper();\n        // helper.secretMessage = "Erreur !";  // Pas visible — autre paquetage\n        // helper.displayMessage();  // Erreur de compilation\n    }\n}
\n\n

Quand l'utiliser : pour les classes utilitaires

Blogs

Book Recommendations