Quelle est la différence entre public, protégé, package-private et privé en Java?

en Java, y a-t-il des règles claires sur le moment d'utiliser chacun des modificateurs d'accès, à savoir les modificateurs par défaut (paquet privé), public , protected et private , tout en faisant class et interface et en traitant de l'héritage?

2582
demandé sur Steve Chambers 2008-10-18 23:53:12

25 réponses

le tutoriel officiel peut vous être utile.

            │ Class │ Package │ Subclass │ Subclass │ World
            │       │         │(same pkg)│(diff pkg)│ 
────────────┼───────┼─────────┼──────────┼──────────┼────────
public      │   +   │    +    │    +     │     +    │   +     
────────────┼───────┼─────────┼──────────┼──────────┼────────
protected   │   +   │    +    │    +     │     +    │         
────────────┼───────┼─────────┼──────────┼──────────┼────────
no modifier │   +   │    +    │    +     │          │    
────────────┼───────┼─────────┼──────────┼──────────┼────────
private     │   +   │         │          │          │    

+ : accessible
blank : not accessible
4768
répondu David S. 2018-06-25 19:47:39

(avertissement: Je ne suis pas un programmeur Java, je suis un programmeur Perl. Perl n'a pas de protections formelles ce qui explique peut-être pourquoi je comprends si bien le problème:))

privé

comme vous le pensez, seule la classe dans laquelle il est déclaré peut le voir.

Colis Privé

Le

ne peut être vu et utilisé que par le paquet dans lequel il a été déclaré. C'est la valeur par défaut en Java (que certains considèrent comme une erreur).

protégé

paquet privé + peut être vu par des sous-classes ou un membre du paquet.

Public

tout le monde peut le voir.

publié

Visible hors du contrôle du code I. (Bien que ce ne soit pas la syntaxe Java, c'est important pour cette discussion).

c++ définit un niveau supplémentaire appelé "ami" et le moins vous connaissez le mieux.

quand utiliser quoi? L'idée est d'encapsuler pour cacher l'information. Autant que possible, vous voulez cacher le détail de la façon dont quelque chose est fait de vos utilisateurs. Pourquoi? Parce que vous pourrez les changer plus tard et ne briser le code de personne. Cela vous permet d'optimiser, de remanier, de redessiner et de corriger les bogues sans crainte que quelqu'un utilise ce code que vous venez de réviser.

ainsi, la règle de base est de rendre les choses aussi visibles qu'elles doivent l'être. Commencez par privé et ajoutez seulement plus de visibilité si nécessaire. Seulement rendre public ce qui est absolument nécessaire pour l'utilisateur de savoir, chaque détail que vous faites public crampes votre capacité à redessiner le système.

si vous voulez que les utilisateurs soient en mesure de personnaliser les comportements, plutôt que de rendre les internes publics afin qu'ils puissent les outrepasser, il est souvent une meilleure idée de pousser ces tripes dans un objet et rendez cette interface publique. De cette façon, ils peuvent tout simplement brancher un nouvel objet. Par exemple, si vous étiez en train d'écrire un lecteur de CD et que vous vouliez le "go find info about this CD" bit customizable, plutôt que de rendre ces méthodes publiques, vous mettriez toutes ces fonctionnalités dans son propre objet et rendriez juste votre objet getter/setter public. De cette façon, être avare d'exposer ses tripes encourage une bonne composition et la séparation des préoccupations

personnellement, je reste avec juste " privé" et "public". Beaucoup de langues OO ont juste cela. "Protégé" peut être pratique, mais c'est vraiment un tricheur. Une fois qu'une interface est plus que privée, elle est hors de votre contrôle et vous devez aller chercher dans le code d'autres personnes pour trouver des utilisations.

C'est là que l'idée de "publié". Changer une interface (le refactoriser) exige que vous trouviez tout le code qui l'utilise et que vous le changiez aussi. Si l'interface est privée, bien aucun problème. Si elle est protégée, vous aller trouver tous les sous-classes. Si elle est publique, vous devez aller trouver tout le code qui utilise votre code. Parfois, c'est possible, par exemple si vous travaillez sur un code d'entreprise qui n'est destiné qu'à un usage interne, peu importe qu'une interface soit publique. Vous pouvez récupérer tout le code du dépôt corporatif. Mais si une interface est "publiée", s'il y a du code qui l'utilise hors de votre contrôle, alors vous êtes fichu. Vous devez supporter cette interface ou le code de risque de rupture. Même protégé les interfaces peuvent être considérées comme publiées (c'est pourquoi je ne prends pas la peine de les protéger).

de nombreuses langues trouvent la nature hiérarchique de public/protégé/privé trop limitative et non conforme à la réalité. À cette fin , il y a le concept d'une classe de trait , mais c'est une autre exposition.

370
répondu Schwern 2013-10-15 19:17:06

Voici une meilleure version de la table. (L'avenir avec une colonne pour les modules.)



Java Access Modifiers

explications

  • Un privé membre seulement accessible à l'intérieur de la même classe qu'elle est déclarée.

  • un membre avec aucun modificateur d'accès n'est accessible que dans les classes du même paquet.

  • a protégé membre accessible dans toutes les classes du même colis et dans les sous-classes des autres colis.

  • Un public membre est accessible à toutes les classes (à moins qu'elle ne réside dans un module qui n'exporte pas le colis dans lequel elle est déclarée).


quel modificateur choisir?

modificateurs D'accès est un outil pour vous aider à prévenir accidentellement briser encapsulation (*) . Demandez-vous si vous voulez que le membre soit quelque chose qui est interne à la classe, paquet, classe hiérarchie ou pas du tout interne, et choisir le niveau d'accès en conséquence.

exemples:

  • un champ long internalCounter devrait probablement être privé car il est mutable et un détail de mise en œuvre.
  • une classe qui ne devrait être instanciée que dans une classe d'usine (dans le même paquet) devrait avoir un constructeur de paquets restreint, car il ne devrait pas être possible de l'appeler directement de l'extérieur paquet.
  • une méthode interne appelée void beforeRender() juste avant le rendu et utilisée comme un crochet dans les sous-classes devrait être protégée.
  • a void saveGame(File dst) méthode qui est appelé à partir du code GUI devrait être publique.

(*) Qu'est-ce que L'Encapsulation?

268
répondu aioobe 2017-05-23 12:10:54
                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔   
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    
169
répondu Abdull 2018-03-06 14:51:26

règle facile. Début de déclarer tout privé. Puis, au fur et à mesure que les besoins se font sentir, on progresse vers le public et la conception le justifie.

lorsque vous exposez des membres, demandez-vous si vous exposez des choix de représentation ou d'abstraction. Le premier est quelque chose que vous voulez éviter car il introduira trop de dépendances sur la représentation réelle plutôt que sur son comportement observable.

en règle générale j'essaie d'éviter primordial implémentations de méthode par sous-classification; il est trop facile de foirer la logique. Déclarez les méthodes protégées abstraites si vous avez l'intention de les annuler.

de plus, utilisez l'annotation @Override lors de la suppression pour éviter que les choses ne se cassent lors du remaniement.

133
répondu John Nilsson 2018-07-24 14:45:18

c'est en fait un peu plus compliqué qu'une simple grille montre. La grille vous dit si un accès est autorisé, mais qu'est-ce qui constitue exactement un accès? De plus, les niveaux d'accès interagissent de façon complexe avec les classes imbriquées et l'héritage.

L'accès "par défaut" (spécifié par l'absence d'un mot clé) est également appelé colis-privé . Exception: dans une interface, aucun modificateur signifie accès public; modificateurs autres que publics sont interdits. Les constantes d'Enum sont toujours publiques.

résumé

c'Est l'accès à un membre avec ce spécificateur d'accès autorisé?

  • membre est private : seulement si le membre est défini dans la même classe que le code d'appel.
  • Membre est colis privé: Seulement si le code d'appel est à l'intérieur du membre immédiatement en joignant paquet.
  • membre est protected : même paquet, ou si le membre est défini dans une superclasse de la classe contenant le code d'appel.
  • Membre public : Oui.

Ce spécificateurs d'accès s'appliquent à

les variables Locales et les paramètres formels ne peuvent pas prendre des spécificateurs d'accès. Étant donné qu'elles sont essentiellement inaccessibles à l'extérieur selon les règles de détermination de la portée, elles sont effectivement privées.

pour les classes le Top scope, seulement public et package-private sont autorisés. Ce choix de conception est probablement dû au fait que protected et private seraient redondants au niveau du colis (il n'y a pas d'héritage des colis).

tous les spécificateurs d'accès sont possibles sur les membres de la classe (constructeurs, méthodes et fonctions des membres statiques, classes imbriquées).

Related: Classe Java Accessibilité

Ordonnance 1519200920"

les spécificateurs d'accès peuvent être commandés strictement

"1519110920 public" > protected > package-privé > privé

signifie que public fournit le plus d'accès, private le moins. Toute référence possible à un membre privé est également valable pour un colis-privé; toute référence à un colis-privé membre est valide sur un membre protégé, et ainsi de suite. (Donnant accès protégé les membres d'autres classes du même paquet ont été considérés comme une erreur.)

Notes

  • d'Une classe de méthodes sont autorisés à accéder aux membres privés d'autres objets de la même classe. plus précisément, une méthode de Classe C peut accéder aux membres privés de C sur les objets de n'importe quelle sous-classe de C. Java ne supporte pas la restriction d'accès par instance, seulement par classe. (Comparer avec Scala, qui fait support à l'aide de private[this] .)
  • Vous avez besoin d'accéder à un constructeur pour construire un objet. Ainsi, si tous les constructeurs sont privés, la classe ne peut être construite que par un code vivant dans la classe (généralement des méthodes statiques d'usine ou des initialisateurs statiques de variables). Il en va de même pour le package-Private ou protected constructors.
    • le fait de N'avoir que des constructeurs privés signifie également que la classe ne peut pas être sous-classée à l'extérieur, étant donné que Java exige une les constructeurs de la sous-classe appellent implicitement ou explicitement un constructeur de superclasses. (Elle peut cependant contenir une classe imbriquée qui la sous-classe.)

classes intérieures

vous devez également considérer emboîtés scopes, tels que les classes intérieures. Un exemple de la complexité est que les classes intérieures ont des membres, qui peuvent eux-mêmes prendre des modificateurs d'accès. Pour que tu puisses avoir une classe privée avec un membre public; le membre peut-il être consulté? (Voir ci-dessous.) La règle générale est d'examiner la portée et de réfléchir de façon récursive pour voir si vous pouvez accéder à chaque niveau.

Cependant, c'est assez compliqué, et pour plus de détails, consulter la Java Language Specification . (Oui, il y a eu des bogues de compilateur dans le passé.)

pour un avant-goût de la façon dont ceux-ci interagissent, considérez cet exemple. Il est possible de "fuir" l'intérieur privé classes; il s'agit habituellement d'un avertissement:

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

sortie du compilateur:

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

Certaines questions connexes:

94
répondu Mechanical snail 2017-05-23 12:34:59

en règle générale:

  • privé : étendue de classe.
  • par défaut (ou colis-privé ): l'étendue d'un package.
  • protégé : package scope + child (comme package, mais nous pouvons le sous-classe de différents packages). Le modificateur protégé conserve toujours la relation" parent-enfant".
  • public : partout.

en conséquence, si nous divisons le droit d'accès en trois droits:

  • (D) irect (invoquer d'une méthode à l'intérieur de la même classe).
  • (R)eference (appeler une méthode à l'aide d'une référence à la classe, ou de la "dot" de la syntaxe).
  • (I)nheritance (via sous-classement).

alors nous avons cette table simple:

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+
64
répondu nxhoaf 2018-03-08 15:47:54

en très court

  • public : accessible de partout.
  • protected : accessible par les classes du même colis et les sous-classes qui y résident.
  • par défaut (aucun modificateur spécifié): accessible par les classes du même paquet.
  • private : accessible dans la même classe seulement.
43
répondu Ravi 2016-09-24 07:05:08

le modificateur d'accès le plus mal compris en Java est protected . Nous savons que c'est similaire au modificateur par défaut avec une exception dans laquelle les sous-classes peuvent le voir. Mais comment? Voici un exemple qui, espérons-le, clarifie la confusion:

  • supposons que nous ayons deux classes; Father et Son , chacune dans son propre colis:

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
    
  • ajoutons une méthode protégée foo() à Father .

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
    
  • la méthode foo() peut être appelée dans 4 contextes:

    1. à l'intérieur D'une classe qui est située dans le même colis où foo() est défini ( fatherpackage ):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
      
    2. à l'intérieur d'une sous-classe, sur l'instance actuelle via this ou super :

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
      
    3. sur une référence dont le type est la même classe:

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
      
    4. sur une référence dont le type est la classe mère et qui est à l'intérieur de le colis dans lequel foo() est défini ( fatherpackage ) [ceci peut être inclus dans le contexte no. 1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
      
  • les situations suivantes ne sont pas valides.

    1. Sur une référence dont le type est la classe mère et c'est à l'extérieur le paquet, où foo() est défini ( fatherpackage ):

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
      
    2. une non-sous-classe à l'intérieur d'un paquet d'une sous-classe (une sous-classe hérite des éléments protégés de son parent, et elle les rend privés aux non-sous-classes):

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
      
33
répondu Eng.Fouad 2017-09-14 19:35:16

privé

  • méthodes, Variables et constructeurs

les méthodes, Variables et constructeurs qui sont déclarés privés ne peuvent être accessibles qu'à l'intérieur de la classe déclarée elle-même.

  • Classe et d'Interface

le modificateur D'accès privé est le niveau d'accès le plus restrictif. Classe et les interfaces ne peuvent pas être privé.

Note

les Variables qui sont déclarées privées peuvent être consultées en dehors de la classe si les méthodes getter publiques sont présentes dans la classe. Les Variables, les méthodes et les constructeurs qui sont déclarés protégés dans une superclasse ne peuvent être accessibles que par les sous-classes d'un autre paquet ou d'une classe quelconque dans le paquet de la classe des membres protégés.


protégé

  • Classe et d'Interface

le modificateur d'accès protégé ne peut être appliqué à la classe et aux interfaces.

, 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. déclarée protégée.

Note

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


Public

une classe, méthode, constructeur, interface etc déclaré public peut être consulté à partir de toute autre classe.

par conséquent, les champs, méthodes, blocs déclarés à l'intérieur d'une classe publique peuvent être consultés à partir de n'importe quelle classe appartenant à L'univers Java.

  • Colis Différents

cependant si la classe publique nous essayons d'accéder est dans un paquet différent, alors la classe publique doit encore être importé.

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.


par Défaut -Pas de mot-clé:

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

  • dans les mêmes colis

une variable ou une méthode déclarée sans modificateur de contrôle d'accès est disponible pour toute autre classe dans le même paquet. Les champs de l'interface sont implicitement public static final et les méthodes d'une interface sont par défaut public.

Note

nous ne pouvons pas outrepasser les champs statiques.si vous essayez d'annuler il ne montre aucune erreur mais elle n'est pas ce que nous sauf.

Réponses

Références liens

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm

24
répondu Nambi 2017-05-23 11:47:36

la différence peut être trouvée dans les liens déjà fournis mais celui à utiliser se résume généralement au"principe de la moindre connaissance". Autoriser uniquement les moins de visibilité de ce qui est nécessaire.

15
répondu Joe Phillips 2008-10-18 20:00:34

privé : accès limité à la classe seulement

par Défaut (pas de modificateur) : l'accès Limité à la classe et le paquet

protégé : accès limité à la classe, au colis et aux sous-classes (colis intérieur et extérieur)

Public : Accessible à la classe, au (X) colis (s) et aux sous-classes... En bref, partout.

15
répondu samkit shah 2017-11-11 22:26:19

modificateurs D'accès en Java.

Les modificateurs D'accès Java

sont utilisés pour fournir le contrôle d'accès en Java.

1. Par défaut:

Accessible uniquement aux classes du même colis.

par exemple,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

cet accès est plus restreint que l'accès public et protégé, mais moins restreint que l'accès privé.

2. Public

est accessible de n'importe où. (Global Access)

par exemple,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

Sortie: Hello

3. Privé

Accessible uniquement dans la même classe.

si vous essayez d'accéder à des membres privés sur une classe dans une autre va jeter l'erreur de compilation. Pour exemple,

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. Protégé

Accessible uniquement aux classes du même colis et aux sous-classes

par exemple,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

Sortie: Hello

Enter image description here

14
répondu Aftab Virtual 2017-11-11 22:38:17

modificateurs d'Accès sont là pour restreindre l'accès à plusieurs niveaux.

Public: il est fondamentalement aussi simple que vous pouvez accéder à partir de n'importe quelle classe, que ce soit dans le même paquet ou non.

Pour l'accès si vous êtes dans le même package, vous pouvez accéder directement, mais si vous êtes dans un autre paquet, vous pouvez créer un objet de la classe.

par Défaut: Il est accessible dans la même colis de n'importe quelle classe de colis.

Pour accéder, vous pouvez créer un objet de la classe. Mais vous ne pouvez pas accéder à cette variable en dehors du paquet.

protégé: vous pouvez accéder aux variables dans le même paquet ainsi qu'à la sous-classe dans tout autre paquet. donc, fondamentalement, il est par défaut + hérité comportement.

pour accéder au champ protégé défini dans la classe de base, vous pouvez créer un objet de la classe enfant.

privé: il peut être accès dans la même classe.

dans les méthodes non statiques vous pouvez accéder directement à cause de cette" référence 151940920 " (aussi dans les constructeurs)mais pour accéder dans les méthodes statiques vous devez créer objet de la classe.

12
répondu Prashant 2017-11-11 22:28:20

Visible par le colis. Défaut. Pas de modificateurs sont nécessaires.

Visible uniquement pour la classe ( privé ).

Visible pour le monde entier ( public ).

Visible pour le colis et toutes les sous-classes ( protégé ).

Variables et méthodes peuvent être déclarées sans aucun modificateur qui sont appelés. Exemples par défaut:

String name = "john";

public int age(){
    return age;
}

modificateur D'accès privé-Privé:

les méthodes, variables et constructeurs qui sont déclarés privés ne peuvent être accessibles qu'à l'intérieur de la classe déclarée elle-même. Le modificateur d'accès privé est le plus restrictif niveau d'accès. La classe et les interfaces ne peuvent pas être privées.

les Variables qui sont déclarées privées peuvent être consultées en dehors de la classe si les méthodes getter publiques sont présentes dans la classe.

utilisant la le modificateur privé est le principal moyen par lequel un objet s'encapsule et cache des données du monde extérieur.

exemples:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

modificateur D'Accès Public - public:

classe, méthode, constructeur, interface, etc. le public déclaré est accessible à partir de n'importe quelle autre classe. Par conséquent, les champs, les méthodes, les blocs déclarés dans une classe publique peuvent être consultés à partir de n'importe quelle classe appartenant à L'univers Java.

cependant, si la classe publique à laquelle nous essayons d'accéder est dans un paquet différent, alors la classe publique doit encore être importée.

en Raison de l'héritage de classes, méthodes et variables d'une classe sont héritées par ses sous-classes.

exemple:

public void cal(){

}

modificateur D'accès protégé-protégé:

Variables, méthodes et constructeurs qui sont déclarés protégés dans un la classe superclasse n'est accessible que par les sous-classes d'un autre paquet ou d'une classe quelconque du paquet 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 de l'assistant ou la variable, tout en empêchant une classe non liée d'essayer de l'utiliser.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}
11
répondu amila isura 2017-11-11 22:32:21
  • public - accessible de n'importe où dans la demande.

  • default - accessible à partir du paquet.

  • protégé - accessible du colis et des sous-classes dans un autre colis. ainsi que

  • privé - accessible à partir de son classe seulement.

10
répondu Shailendra Singh 2016-03-16 15:31:37

je veux juste aborder un détail qui est très souvent trompées, y compris par la plupart des réponses sur cette page. accès "par Défaut" (quand pas de modificateur d'accès) n'est pas toujours le même paquet-privé . Cela dépend de ce que la chose est.

  • les types Non-membres (c'est-à-dire, les classes, les enums, les interfaces et les types d'annotation non déclarés dans un autre type) sont paquet-privé par défaut. ( JLS §6.6.1 )

  • les membres de la Classe et les constructeurs sont des colis-privé par défaut. ( JLS §6.6.1 )

  • les constructeurs Enum sont private by default . (En effet, enum contructors doit être privé, et c'est une erreur d'essayer de les rendre publics ou protégés). Les constantes d'Enum sont publiques et ne permettent aucun spécificateur d'accès. Les autres membres d'enums sont package-private par défaut. ( JLS §8.9 )

  • tous les membres des types d'interfaces et d'annotation sont public by default . (En effet, les membres des types d'interfaces et d'annotation doivent être publics, et c'est une erreur d'essayer de les rendre privés ou protégés.) ( JLS §9.3 à 9.5 )

9
répondu Boann 2015-10-21 12:07:06

cette page décrit bien le modificateur d'accès protégé et par défaut

.... Protégé: le modificateur D'accès protégé est le un peu délicat et vous pouvez dire est un super-ensemble du modificateur d'accès par défaut. Protégé membres sont les mêmes que les membres par défaut autant que l'accès dans le même paquet. La différence est que, les membres sont également accessibles pour les sous-classes de la classe dans laquelle le membre est déclaré qui sont en dehors du paquet dans lequel la classe mère est présente.

mais ces membres protégés sont "accessibles à l'extérieur du paquet uniquement par héritage". I. e vous pouvez accéder à un membre protégé d'une classe dans sa sous-classe présent dans un autre paquet directement comme si le membre était présent dans la sous-classe elle-même. Mais ce membre protégé ne sera pas accessible dans la sous-classe à l'extérieur du paquet en utilisant le renvoi de la classe mère. ....

9
répondu dameng 2017-11-11 22:23:45

la réponse de David donne le sens de chaque modificateur d'accès. Pour ce qui est du moment d'utiliser chacune, je suggérerais de rendre publiques toutes les classes et les méthodes de chaque classe qui sont destinées à un usage externe (son API), et tout le reste privé.

au fil du temps, vous développerez un sens pour quand faire certaines classes paquet-privé et quand déclarer certaines méthodes protégées pour une utilisation dans les sous-classes.

8
répondu Dov Wasserman 2017-11-11 22:22:55
  • Visible par le colis. le par défaut . Pas de modificateurs sont nécessaires.
  • Visible uniquement pour la classe; privé .
  • Visible pour le monde; public .
  • Visible pour le colis et toutes les sous-classes; protégé .

alors parlons du contrôle d'accès et de L'héritage Les règles suivantes pour les méthodes héritées sont,

  • méthodes déclarées public dans une superclasse doit également être public dans tous les sous-classes.
  • méthodes déclarées protected dans une superclasse doit être soit protected ou public dans les sous-classes; elles ne peuvent pas être privées.
  • Les méthodes
  • déclarées sans contrôle d'accès (aucun modificateur n'a été utilisé) peuvent être déclaré plus privé dans les sous-classes.
  • méthodes déclarées private ne sont pas héritées du tout, il n'y a donc pas la règle pour eux.
6
répondu AVI 2015-12-20 02:58:29

Note: ce n'est qu'un supplément pour la réponse acceptée.

ceci est lié à Java modificateurs D'accès .

À Partir De Java Modificateurs D'Accès :

un modificateur D'accès Java spécifie quelles classes peuvent accéder à une donnée de la classe et de ses champs, des constructeurs et des méthodes. Modificateurs d'accès peut être spécifié séparément pour une classe, ses constructeurs, champs et méthode. Les modificateurs d'accès Java sont aussi parfois mentionnés dans le quotidien discours que Java spécificateurs d'accès, mais le nom correct est d'accès Java modificateur. Les Classes, les domaines, les constructeurs et les méthodes peuvent avoir quatre modificateurs D'accès Java différents:

  • élément de la Liste
  • privé
  • par défaut (package)
  • protégé
  • public

à Partir de Contrôle de l'Accès aux Membres d'une Classe tutoriels:

Les modificateurs de niveau d'accès

déterminent si d'autres classes peuvent utiliser un champ ou d'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, privé, protégé, ou package-Privé (pas de modificateur explicite).

une classe peut être déclarée avec le modificateur public, auquel cas: class est visible à toutes les classes partout. Si une classe n'a pas de modificateur (la valeur par défaut, aussi connu comme colis-privé), il est visible que dans son propre emballage

Le tableau suivant montre l'accès aux membres autorisés par chaque modificateur.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

la première colonne de données indique si la classe elle-même a accès à le membre défini par le niveau d'accès. Comme vous pouvez le voir, une classe toujours a accès qu'à ses propres membres. La deuxième colonne indique si classes dans le même paquet que la classe (indépendamment de leur la filiation) avoir accès à du membre. La troisième colonne indique si les sous-classes de la classe déclarée en dehors de ce forfait ont l'accès au membre. Le la quatrième colonne indique si toutes les classes avoir accès à du membre.

les niveaux d'accès vous affectent de deux façons. Tout d'abord, lorsque vous utilisez des classes qui proviennent d'une autre source, comme les classes de la plate-forme Java, les niveaux d'accès déterminent quels membres de ces classes sont les vôtres les classes peuvent utiliser. Deuxièmement, lorsque vous écrivez une classe, vous devez décider quel niveau d'accès chaque variable membre et chaque méthode de votre classe devrait avoir.

6
répondu ישו אוהב אותך 2016-11-17 05:05:01

Public Protégé par Défaut et privés sont des modificateurs d'accès.

ils sont destinés à l'encapsulation ou à la dissimulation et à la présentation du contenu de la classe.

  1. Classe peut être public ou par défaut
  2. Les membres de la classe
  3. peuvent être publics, protégés, par défaut ou privés.

Privée n'est pas accessible à l'extérieur de la classe La valeur par défaut n'est accessible que dans le paquet. Protégé dans l'emballage ainsi que tout la classe qui l'étend. Public est ouvert à tous.

normalement, les variables de membre sont définies privé, mais les méthodes de membre sont publiques.

5
répondu richa_v 2014-07-30 03:51:40

souvent j'ai réalisé que se souvenir des concepts de base de n'importe quel langage peut rendre possible en créant des analogies du monde réel. Voici mon analogie pour comprendre les modificateurs d'accès en Java:

supposons que vous êtes un étudiant à l'université et que vous avez un ami qui vient vous rendre visite le week-end. Supposons qu'il existe une grande statue du fondateur de l'université au milieu du campus.

  • Quand tu l'amènes au campus, la première chose que toi et ton ami voyez est cette statue. Cela signifie que n'importe qui qui marche dans le campus peut regarder la statue sans la permission de l'Université. Cela rend la statue comme publique .

  • ensuite, vous voulez emmener votre ami à votre dortoir, mais pour cela vous devez l'enregistrer comme un visiteur. Cela signifie qu'il obtient un laissez-passer d'accès (qui est le même que le vôtre) pour entrer divers bâtiments sur le campus. Cela ferait de sa carte d'accès une carte protégée .

  • votre ami veut se connecter au campus WiFi mais n'a pas les justificatifs pour le faire. Le seul moyen qu'il puisse se connecter est si vous partagez votre connexion avec lui. (Rappelez-vous, chaque étudiant qui va à l'université possède également ces justificatifs d'identité). Cela ferait de vos identifiants de connexion comme aucun modificateur .

  • Enfin, votre ami veut lire votre rapport d'avancement pour le semestre qui est affiché sur le site web. Cependant, chaque étudiant a son propre login personnel pour accéder à cette section du site Web du campus. Cela ferait de ces lettres de créance privé .

Espérons que cette aide!

5
répondu Greedy Coder 2017-04-06 04:09:22

quand vous pensez aux modificateurs d'accès, pensez-y simplement de cette façon (s'applique à la fois aux "variables et aux" méthodes ):

public -- > accessible de partout

private --> accessible seulement dans la même classe où il est déclaré

maintenant la confusion surgit quand il s'agit de default et protected

default --> Aucun mot-clé modificateur d'accès n'est présent. Cela signifie qu'il est disponible uniquement dans le paquet de la classe. nulle part en dehors de ce paquet, il est accessible.

protected -- > légèrement moins strict que default et en dehors des mêmes classes de colis, il est accessible par des sous-classes en dehors du colis il est déclaré.

4
répondu Pritam Banerjee 2017-06-27 02:38:18

il s'agit de encapsulation (ou comme Joe Phillips a déclaré, le moins de connaissances ).

commencez par le plus restrictif (privé) et voyez si vous avez besoin de modificateurs moins restrictifs plus tard.

Nous sommes tous d'utiliser la méthode et membre modificateurs comme privé, public, ... mais une chose de trop peu de développeurs font est d'utiliser des paquets pour organiser code logiquement.

pour exemple: Vous pouvez mettre des méthodes de sécurité sensibles dans un paquet "sécurité". Ensuite, mettez une classe publique qui accède à une partie du code lié à la sécurité dans ce paquet, mais conservez les autres classes de sécurité paquet privé . Ainsi, les autres développeurs ne pourront utiliser la classe accessible au public que depuis l'extérieur de ce paquet (à moins qu'ils ne changent le modificateur). Ce n'est pas une caractéristique de sécurité, mais sera guide utilisation.

Outside world -> Package (SecurityEntryClass ---> Package private classes)

Une autre chose est que les classes qui dépendent beaucoup les unes des autres peuvent finir dans le même paquet et pourraient éventuellement être remaniées ou fusionnées si la dépendance est trop forte.

si au contraire vous définissez tout comme public il ne sera pas clair ce qui devrait ou ne devrait pas être accédé, ce qui peut conduire à écrire beaucoup de javadoc (qui n'impose rien via le compilateur...).

0
répondu Christophe Roussy 2018-07-31 11:27:23