L'accès des membres «package private» n'est-il pas synonyme de l'accès par défaut (sans modificateur)?

94

Je suis un peu confus au sujet du terme «package privé» utilisé par une partie de la documentation, ainsi que de l'utilisation de «l'accès par défaut». Les accès privés et par défaut ne sont-ils pas tous deux synonymes de protection?

TortueToes
la source
7
Donc, il n'y a aucun mot-clé pour exprimer l'accès privé au package? C'est seulement implicite en ne spécifiant pas le modificateur d'accès?
TurtleToes
5
TurtleToes, c'est vrai, et cela peut être un peu déroutant dans Java 8, car il est en fait possible de placer un defaultmodificateur devant les méthodes (d'interface). Mais ce n'est pas un modificateur d'accès! Tous les modificateurs d'accès et leurs portées sont clairement visualisés dans ce tableau .
aioobe
1
vous pouvez également consulter le tableau du didacticiel sur docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

Réponses:

136

Oui, c'est presque pareil. Le modificateur protected spécifie que le membre n'est accessible que dans son propre package (comme avec package-private) et, en plus , par une sous-classe de sa classe dans un autre package.

Luciano Fiandesio
la source
Il y avait beaucoup de bonnes réponses ici, mais celle-ci l'a expliqué de manière simple et précise, alors je l'accepte
TurtleToes
23
Il convient de noter que l'accès par défaut pour le membre d'interface n'est pas privé du package.
Peter Lawrey
1
@PeterLawrey Oh? Quel est alors l'accès par défaut pour les membres de l'interface?
ArtOfWarfare
8
La valeur par défaut pour un champ est public static final, pour une méthode est public abstract, pour une énumération ou une annotation est publicet pour une classe ellepublic static
Peter Lawrey
36

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 seules les choses du même package peuvent y accéder. Cependant, être dans le même package n'implique rien sur la relation d'héritage entre les classes - c'est purement une convention de dénomination.

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

Adrian Petrescu
la source
Eh
15

L'accès par défaut pour les classes est privé du package, mais l'accès par défaut pour les membres de l' interface est public.

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.

Peter Lawrey
la source
3

L'accès au package privé et par défaut sont des synonymes. Un objet peut également accéder au membre protégé des objets dont les classes sont dans le même package. Un objet peut également accéder au membre protégé de ses superclasses sans condition concernant leur package. A titre d'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     
    }
Gursel Koca
la source
un électeur défavorable pourrait expliquer ce qui ne va pas dans cette explication? .. sauf une mauvaise formulation ..
Gursel Koca
6
Je ne suis pas un contre-vote, mais je suppose que c'est parce que ce n'est pas tout à fait correct; un objet peut accéder aux membres protégés des superclasses, quel que soit le package.
Adrian Petrescu
1

'Package privé' et l'accès par défaut sont identiques. Dans les premières versions du compilateur vers la 1.1.2 / 3, «package» était un modificateur autorisé, mais ignoré, ce qui signifie la même chose qu'aucun modificateur, c'est-à-dire «package private». Peu de temps après, il y eut une mode de courte durée pour mettre /*package*/(en commentaire) dans de telles situations. De même, à ce moment-là, vous pouviez déclarer des choses comme des classes synchronisées, bien que là encore, il n'y ait pas eu d'effet sémantique réel.

Aucun d'eux n'est identique à «protected», qui s'étend aux classes dérivées dans d'autres packages.

Marquis de Lorne
la source
0

À partir de Java Language Spec

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

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

Programmeur mort
la source
2
Mais qu'en est-il du "package privé". Ce n'est pas dans le JLS.
Tom Hawtin - tackline
-1

default et package-private sont identiques, ce qui signifie que les deux peuvent être utilisés par n'importe quelle classe jusqu'à ce qu'ils soient dans le même package.

Le terme package-private , en fait, est appelé par le sens du modificateur privé car private signifie qu'il n'est disponible que dans la même classe et qu'aucune autre classe ou sous-classe ne peut y accéder dans le même package ou sans.

Par conséquent, package-private signifie la même chose que par défaut .

aayush shah
la source