Les modificateurs d'accès déterminent la visibilité des classes, méthodes ou variables par rapport aux autres membres et aux autres classes, ainsi qu'entre les paquetages.

Dans la plupart des cas, il est préférable de restreindre autant que possible la portée des éléments d'un programme Java, dans la mesure où, l'encapsulation est un des concepts fondamentaux de la programmation orientée objet.

En effet, une classe peut être complétement encapsulées en déclarant toutes ses variables privées, mais en permetant aux accesseurs d'accèder à ces dernières et aux mutateurs de les modifier, créant ainsi une interface publique (voir les méthodes d'accès).
De plus, un membre privé peut être accédé par n'importe quel instance de sa classe parente.

Les modificateurs d'accès
Modificateur Description
default Si aucun modificateur d'accès n'est déclaré, le membre ou la classe interne sera accessible pour l'ensemble des classes et sous-classes situées dans le paquetage parent, mais en aucun cas, à l'extérieur de ce dernier.
Une classe est également accessible par toutes les classes d'un même paquetage.
public Un membre public est accessible par tous les membres, y compris ceux hors de sa portée, et tant que la classe parente est elle-même visible.
Une classe interne peut être accédée par toutes les classes dérivées de sa classe mère, y compris celles d'un paquetage différent.
Une classe publique est accessible par toutes les classes de tous les paquetages.
private Un membre ou une classe interne privé est uniquement accessible par sa classe parente.
protected Un membre protégé est seulement accessible par les membres de sa classe parente et par ceux du paquetage parent et tant que la classe parente est elle-même accessible.
Une classe interne protégée est accessible pour toutes les classes étendues de la classe mère, y compris celles d'un paquetage différent.

Les classes ne peuvent être ni privées et ni protégées, hormis les classes internes, celles définies au sein d'une classe.

Le modificateur d'accès par défaut est parfois appelé Friendly (Appellation non-officielle provenant du langage C++).

Les modes d'accès par élément
  Par défaut Privé Protégé Public
Classes Oui Non Non Oui
Classes internes Oui Oui Oui Oui
Interfaces Oui Non Non Oui
Méthodes Oui Oui Oui Oui
Constructeurs Oui Oui Oui Oui
Variables Oui Oui Oui Oui
Membres abstraits Oui Non Non Oui

Ce tableau décrit les modificateurs d'accès possibles pour chaque élément principal d'un programme Java.

En l'absence d'un modificateur, Les constructeurs sont par défaut uniquement accessibles dans le paquetage de la classe parente.
Le modificateur private appliqué au constructeur entraîne l'impossibilité d'instancier sa classe.

Les accès dans les membres d'interfaces (abstraits) ne peuvent être que publiques, et par voie de conséquence, l'accès par défaut est également publique.

interface UneInterface {
  public String uneMethode();
  boolean uneAutreMethode();
  // Les deux méthodes sont publiques
}
Accessibilité depuis un paquetage
Modificateur d'accès Intérieur Extérieur
Héritage Accessible Héritage Accessible
Par défaut Oui Oui Non Non
Private Non Non Non Non
Protected Oui Oui Oui Non
Public Oui Oui Oui Oui

Ce tableau indique comment les autres membres d'un même paquetage ou d'un autre différent, sont capables d'accèder aux membres d'une classe et d'en hériter.

A l'intérieur d'un paquetage, seuls les membres et les classes internes privés ne peuvent être accessibles pour d'autres éléments de ce même paquetage. De même, il est impossible pour ces derniers, d'en hériter.

Depuis l'extérieur d'un paquetage, une des différences concerne les éléments protégés, puisque tout en étant inaccessibles, ils peuvent être hérités par d'autres (classes dérivées) situés dans un paquetage distinct.

package package1; public class UnePremiereClasse { type var_pardefaut; public type var_publique; protected type var_protegee; private type var_privee; public void uneMethode(){ var_pardefaut = valeur; var_publique = valeur; var_protegee = valeur; var_privee = valeur; } } public class UneSecondeClasse { UnePremiereClasse UnObjet = new UnePremiereClasse(); public void uneMethode(){ UnObjet.var_pardefaut = valeur; UnObjet.var_publique = valeur; UnObjet.var_protegee = valeur; } } public class UneSousClasse extends UnePremiereClasse { public void uneMethode(){ var_pardefaut = valeur; var_publique = valeur; var_protegee = valeur; } }
package package2; public class UneQuatriemeClasse { public void uneMethode(){ // Aucun accès à UnePremiereClasse... } } import package1.UnePremiereClasse; public class UneTroisiemeClasse { UnePremiereClasse UnAutreObjet = new UnePremiereClasse(); public void uneMethode(){ UnAutreObjet.var_publique = valeur; } } public class UneAutreSousClasse extends UnePremiereClasse { public void uneMethode(){ var_publique = valeur; var_protegee = valeur; } } public class UneDerniereSousClasse extends UneAutreSousClasse { public void uneMethode(){ var_publique = valeur; var_protegee = valeur; } }