Java - Modificateurs d'accès

Java fournit un certain nombre de modificateurs d'accès pour définir les niveaux d'accès pour les classes, les variables, les méthodes et les constructeurs. Les quatre niveaux d'accès sont -

  • Visible par le package, la valeur par défaut. Aucun modificateur n'est nécessaire.
  • Visible par la classe uniquement (privé).
  • Visible au monde (public).
  • Visible pour le package et toutes les sous-classes (protégées).

Modificateur d'accès par défaut - Aucun mot-clé

Le modificateur d'accès par défaut signifie que nous ne déclarons pas explicitement un modificateur d'accès pour une classe, un champ, une méthode, etc.

Une variable ou une méthode déclarée sans aucun modificateur de contrôle d'accès est disponible pour n'importe quelle autre classe du même package. Les champs d'une interface sont implicitement publics static final et les méthodes d'une interface sont par défaut publiques.

Exemple

Les variables et méthodes peuvent être déclarées sans aucun modificateur, comme dans les exemples suivants -

String version = "1.5.1";

boolean processOrder() {
   return true;
}

Modificateur d'accès privé - Privé

Les méthodes, variables et constructeurs déclarés privés ne sont accessibles que dans la classe déclarée elle-même.

Le modificateur d'accès privé est le niveau d'accès le plus restrictif. La classe et les interfaces ne peuvent pas être privées.

Les variables déclarées privées sont accessibles en dehors de la classe, si des méthodes getter publiques sont présentes dans la classe.

L'utilisation du modificateur privé est le principal moyen par lequel un objet s'encapsule et masque les données du monde extérieur.

Exemple

La classe suivante utilise le contrôle d'accès privé -

public class Logger {
   private String format;

   public String getFormat() {
      return this.format;
   }

   public void setFormat(String format) {
      this.format = format;
   }
}

Ici, la variable de format de la classe Logger est privée, il n'y a donc aucun moyen pour les autres classes de récupérer ou de définir sa valeur directement.

Ainsi, pour rendre cette variable accessible au monde extérieur, nous avons défini deux méthodes publiques: getFormat () , qui renvoie la valeur de format, et setFormat (String) , qui définit sa valeur.

Modificateur d'accès public - Public

Une classe, une méthode, un constructeur, une interface, etc. déclarés publics sont accessibles depuis n'importe quelle autre classe. Par conséquent, les champs, méthodes, blocs déclarés à l'intérieur d'une classe publique sont accessibles depuis n'importe quelle classe appartenant à l'univers Java.

Cependant, si la classe publique à laquelle nous essayons d'accéder est dans un package différent, la classe publique doit encore être importée. En raison de l'héritage de classe, toutes les méthodes et variables publiques d'une classe sont héritées par ses sous-classes.

Exemple

La fonction suivante utilise le contrôle d'accès public -

public static void main(String[] arguments) {
   // ...
}

La méthode main () d'une application doit être publique. Sinon, il ne pourrait pas être appelé par un interpréteur Java (tel que java) pour exécuter la classe.

Modificateur d'accès protégé - Protégé

Les variables, méthodes et constructeurs, qui sont déclarés protégés dans une superclasse, ne sont accessibles que par les sous-classes d'un autre package ou de toute classe du package de la classe des membres protégés.

Le modificateur d'accès protégé ne peut pas être appliqué à la classe et aux interfaces. Les méthodes, les champs peuvent être déclarés protégés, mais les méthodes et les champs d'une interface ne peuvent pas être déclarés protégés.

L'accès protégé donne à la sous-classe une chance d'utiliser la méthode ou la variable d'assistance, tout en empêchant une classe non liée d'essayer de l'utiliser.

Exemple

La classe parent suivante utilise un contrôle d'accès protégé, pour permettre à sa classe enfant de remplacer la méthode openSpeaker () -

class AudioPlayer {
   protected boolean openSpeaker(Speaker sp) {
      // implementation details
   }
}

class StreamingAudioPlayer extends AudioPlayer {
   boolean openSpeaker(Speaker sp) {
      // implementation details
   }
}

Ici, si nous définissons la méthode openSpeaker () comme privée, alors elle ne serait pas accessible à partir d'une autre classe autre qu'AudioPlayer . Si nous le définissons comme public, alors il deviendrait accessible à tout le monde extérieur. Mais notre intention est d'exposer cette méthode à sa sous-classe uniquement, c'est pourquoi nous avons utilisé le modificateur protected.

Contrôle d'accès et héritage

Les règles suivantes pour les méthodes héritées sont appliquées -

  • Les méthodes déclarées publiques dans une superclasse doivent également être publiques dans toutes les sous-classes.

  • Les méthodes déclarées protégées dans une superclasse doivent être protégées ou publiques dans les sous-classes; ils ne peuvent pas être privés.

  • Les méthodes déclarées privées ne sont pas du tout héritées, il n'y a donc pas de règle pour elles.