97 votes

L'accès au membre "package private" n'est-il pas synonyme d'accès par défaut (sans modificateur) ?

Je suis un peu confus quant au terme "package private" que certains documents utilisent, ainsi que l'utilisation de "l'accès par défaut". Les termes "package-private" et "accès par défaut" ne sont-ils pas tous deux synonymes de "protégé" ?

7 votes

Donc, il n'y a aucun mot clé pour l'accès privé au paquet express ? Il est seulement implicite en ne spécifiant pas le modificateur d'accès ?

5 votes

TurtleToes, c'est exact, et cela peut être un peu déroutant en Java 8, puisqu'il est en fait possible de mettre default devant les méthodes (d'interface). Mais ce n'est pas un modificateur d'accès ! Tous les modificateurs d'accès et leur portée sont clairement visualisés dans le document ce tableau .

1 votes

Vous pouvez également consulter le tableau du tutoriel de docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

138voto

Luciano Fiandesio Points 4795

Oui, c'est presque la même chose. Le modificateur protected spécifie que le membre ne peut être accédé qu'au sein de son propre package (comme avec package-private) et, en outre par une sous-classe de sa classe dans un autre paquet.

0 votes

Il y avait beaucoup de bonnes réponses ici, mais celle-ci l'a expliqué de manière simple et précise, donc je l'accepte.

25 votes

Il convient de noter que l'accès par défaut pour le membre de l'interface est pas paquet-privé.

1 votes

Quel est l'accès par défaut pour les membres de l'interface, alors ?

36voto

Adrian Petrescu Points 4618

Le modificateur d'accès "par défaut" (celui où aucun d'entre eux n'est explicitement donné) est "package-private", ce qui signifie que seuls les éléments du même paquet peuvent y accéder. Cependant, le fait d'être dans le même paquetage n'implique rien sur la relation d'héritage entre les classes -- c'est purement une convention de nommage.

"Protégé" signifie que non seulement les classes du même paquet, mais aussi les sous-classes (quel que soit le paquet dans lequel ces sous-classes se trouvent) pourront y accéder.

0 votes

Eh bien, votre formulation sur la protection est erronée Les instances de la classe du même paquet peuvent également accéder aux membres protégés

16voto

Peter Lawrey Points 229686

L'accès par défaut pour classes est privé par paquet, mais l'accès par défaut pour les fichiers interface est publique.

par exemple

public interface I {
   int A = 1;
// same as
   public static final int A = 1;

   void method();
// same as
   public abstract void method();

   class C { }
// same as
   public static class C { }
}

Les règles d'accès par défaut pour les interfaces ne sont pas les mêmes que pour les classes.

2voto

Gursel Koca Points 8541

L'accès privé par paquet et l'accès par défaut sont des synonymes. Un objet peut également accéder aux membres protégés des objets dont les classes sont dans le même paquetage. Un objet peut également accéder aux membres protégés de ses superclasses sans condition concernant leur paquetage. Un exemple concret :

package ab;

class A {
   protected void foo() {}
   void dd(){}
}

class C {
   void aa(){
       A a = new A();
       a.foo(); //legal
       a.dd();  //legal
   }
}

package sub;

class D extends A{
      void ac(){
         foo(); //legal ..
         dd();  //illegal.. because dd has default access.. 
      }

class E {
    void ee(){
       A a = new A();
       a.foo(); //illegal
       a.dd();  //illegal     
    }

0 votes

Downvoter pourrait expliquer ce qui ne va pas dans cette explication sauf une mauvaise formulation

6 votes

Je ne suis pas le rabat-joie, mais je suppose que c'est parce que ce n'est pas tout à fait juste ; un objet peut accéder à protégé les membres des superclasses, quel que soit le package.

0voto

Dead Programmer Points 5428

De Spécification du langage Java

  • 6.6.5 Exemple : Champs, méthodes et constructeurs d'accès par défaut Si aucun des modificateurs d'accès n'est public, protected, ou private n'est spécifié, un membre ou le constructeur d'une classe est accessible dans tout le paquet qui contient contient la déclaration de la classe dans laquelle le membre de la classe est déclaré, mais le membre ou le constructeur de la classe n'est accessible dans tout autre paquetage.

Si une classe publique possède une méthode ou constructeur avec un accès par défaut, alors cette méthode ou ce constructeur n'est pas accessible ou hérité par une sous-classe déclarée en dehors de ce paquet

2 votes

Mais qu'en est-il du "paquet privé". Ce n'est pas dans le JLS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X