Java Language
Visibilité (contrôle de l'accès aux membres d'une classe)
Recherche…
Syntaxe
- nom de type public [= valeur];
- nom de type privé [= valeur];
- nom de type protégé [= valeur];
- tapez nom [= valeur];
- nom de classe publique {
- nom du cours{
Remarques
A partir du tutoriel Java :
Les modificateurs de niveau d'accès déterminent si d'autres classes peuvent utiliser un champ particulier ou invoquer une méthode particulière. Il y a deux niveaux de contrôle d'accès:
- Au niveau supérieur -
public
ou package-private (pas de modificateur explicite). - Au niveau des membres:
public
,private
,protected
ou package-privé (aucun modificateur explicite).
Une classe peut être déclarée avec le modificateur public
, auquel cas cette classe est visible par toutes les classes partout. Si une classe n'a pas de modificateur (valeur par défaut, également appelée package-private ), elle n'est visible que dans son propre package.
Au niveau des membres, vous pouvez également utiliser le modificateur public
ou aucun modificateur ( package-private ) de la même manière qu'avec les classes de niveau supérieur et avec la même signification. Pour les membres, il existe deux modificateurs d’accès supplémentaires: private
et protected
. Le modificateur private
spécifie que le membre ne peut être accédé que dans sa propre classe. Le modificateur protected
spécifie que le membre ne peut être accédé que dans son propre package (comme avec package-private ) et, en outre, par une sous-classe de sa classe dans un autre package.
Le tableau suivant montre l’accès aux membres permis par chaque modificateur.
Niveaux d'accès:
Modificateur | Classe | Paquet | Sous classe | Monde |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
pas de modificateur | Y | Y | N | N |
private | Y | N | N | N |
Membres d'interface
public interface MyInterface {
public void foo();
int bar();
public String TEXT = "Hello";
int ANSWER = 42;
public class X {
}
class Y {
}
}
Les membres d'interface ont toujours une visibilité publique, même si le mot clé public
est omis. Ainsi, foo()
, bar()
, TEXT
, ANSWER
, X
et Y
ont une visibilité publique. Cependant, l'accès peut encore être limité par l'interface contenant - MyInterface
ayant une visibilité publique, ses membres peuvent être accédés de n'importe où, mais si MyInterface
avait eu la visibilité du package, ses membres n'auraient été accessibles qu'à partir du même package.
Visibilité publique
Visible à la classe, au package et à la sous-classe.
Voyons un exemple avec la classe Test.
public class Test{
public int number = 2;
public Test(){
}
}
Essayons maintenant de créer une instance de la classe. Dans cet exemple, nous pouvons accéder au number
car il est public
.
public class Other{
public static void main(String[] args){
Test t = new Test();
System.out.println(t.number);
}
}
Visibilité privée
private
visibilité private
permet à une variable d'être uniquement accessible par sa classe. Ils sont souvent utilisés en conjonction avec public
getters et les installateurs public
.
class SomeClass {
private int variable;
public int getVariable() {
return variable;
}
public void setVariable(int variable) {
this.variable = variable;
}
}
public class SomeOtherClass {
public static void main(String[] args) {
SomeClass sc = new SomeClass();
// These statement won't compile because SomeClass#variable is private:
sc.variable = 7;
System.out.println(sc.variable);
// Instead, you should use the public getter and setter:
sc.setVariable(7);
System.out.println(sc.getVariable());
}
}
Visibilité du package
Sans modificateur , la valeur par défaut est la visibilité du package. Dans la documentation Java, "[visibilité du package] indique si les classes du même package que la classe (indépendamment de leur parenté) ont accès au membre." Dans cet exemple de javax.swing
,
package javax.swing;
public abstract class JComponent extends Container … {
…
static boolean DEBUG_GRAPHICS_LOADED;
…
}
DebugGraphics
est dans le même package, de sorte que DEBUG_GRAPHICS_LOADED
est accessible.
package javax.swing;
public class DebugGraphics extends Graphics {
…
static {
JComponent.DEBUG_GRAPHICS_LOADED = true;
}
…
}
Cet article donne quelques informations sur le sujet.
Visibilité protégée
La visibilité protégée signifie que ce membre est visible pour son package, ainsi que ses sous-classes.
Par exemple:
package com.stackexchange.docs;
public class MyClass{
protected int variable; //This is the variable that we are trying to access
public MyClass(){
variable = 2;
};
}
Nous allons maintenant étendre cette classe et essayer d'accéder à l'un de ses membres protected
.
package some.other.pack;
import com.stackexchange.docs.MyClass;
public class SubClass extends MyClass{
public SubClass(){
super();
System.out.println(super.variable);
}
}
Vous pourrez également accéder à un membre protected
sans le prolonger si vous y accédez à partir du même package.
Notez que ce modificateur ne fonctionne que sur les membres d'une classe, pas sur la classe elle-même.
Résumé des modificateurs d'accès des membres du groupe
Modificateur d'accès | Visibilité | Héritage |
---|---|---|
Privé | Classe seulement | Ne peut pas être hérité |
Aucun modificateur / paquet | En paquet | Disponible si la sous-classe dans le package |
Protégé | En paquet | Disponible dans la sous-classe |
Publique | Partout | Disponible dans la sous-classe |
Il était une fois un modificateur private protected
(les deux mots-clés à la fois) qui pouvait être appliqué aux méthodes ou aux variables pour les rendre accessibles depuis une sous-classe en dehors du paquet, mais les rendre privées aux classes de ce paquet. Cependant, cela a été supprimé dans la version de Java 1.0 .