En Java, y at - il des règles claires sur quand utiliser chacun des modificateurs d'accès, à savoir la valeur par défaut (privé paquet), public
, protected
et private
, tout en faisant class
et interface
et sur la succession?
3171
private
masque les autres classes du package.public
expose à des classes en dehors du package.protected
est une version depublic
restreinte uniquement aux sous-classes.protected
la méthode est également accessible à partir de l'ensemble du package. Cette stupidité dans le modèle de visibilité de Java brise l'objectif deprotected
.protected
. A titre d'accès modificateur , tout ce quiprotected
ne fait d'exposer à l' extérieur du colis sous - classes.protected
- et je cite - `` est une version du public limitée uniquement aux sous-classes '', ce qui n'est pas vrai de votre propre aveu, car protégé permet également d'accéder à l'ensemble du package (ergo, il ne restreint pas l' accès aux sous-classes. )protected-package
pour les rares cas où nous en avions réellement besoin, laissantprotected
l'équivalent de la version C ++ de protected.Réponses:
Le tutoriel officiel peut vous être utile.
la source
private
membres peuvent être vus / utilisés par n'importe quelle classe / méthode statique dans le même fichier source.MyClass
et que je le fais,AnotherClass extends MyClass
j'aurai accès à toutes les méthodes et propriétés publiques et protégées de l'intérieurAnotherClass
. Si je faisMyClass myClass = new MyClass();
dansAnotherClass
quelque part - disons que le constructeur - je n'avoir accès aux méthodes publiques si elle est dans un emballage différent. Notez que si je le fais,= new MyClass() { @Override protected void protectedMethod() { //some logic } };
il semble que je puisse accéder aux méthodes protégées, mais ce genre de chose comme l'étendre, mais en ligne à la place.protected
(ce qui est en fait un modificateur d'accès assez difficile à comprendre pleinement - la plupart des gens qui pensent savoir ce queprotected
signifie vraiment pas). De plus, comme Bohème l'a souligné, il ne répond pas à la question - il ne dit rien sur le moment d'utiliser chaque modificateur d'accès. À mon avis, cette réponse n'est pas assez mauvaise pour dévaloriser, mais ferme. Mais plus de 4000 votes positifs? Comment est-ce arrivé?(Attention: je ne suis pas un programmeur Java, je suis un programmeur Perl. Perl n'a pas de protections formelles, c'est 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.
Forfait privé
Il ne peut être vu et utilisé que par le package 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é
Le package Private + peut être vu par les sous-classes ou les membres du package.
Publique
Tout le monde peut le voir.
Publié
Visible en dehors du code que je contrôle. (Bien que n'étant pas une syntaxe Java, elle est importante pour cette discussion).
C ++ définit un niveau supplémentaire appelé "ami" et moins vous en savez, mieux c'est.
Quand devez-vous utiliser quoi? L'idée est d'encapsuler pour cacher des informations. Autant que possible, vous souhaitez masquer le détail de la façon dont quelque chose est fait à vos utilisateurs. Pourquoi? Parce qu'alors vous pouvez les changer plus tard et ne casser le code de personne. Cela vous permet d'optimiser, de refactoriser, de repenser et de corriger les bogues sans vous soucier que quelqu'un utilise ce code que vous venez de réviser.
Donc, la règle de base est de rendre les choses aussi visibles qu'elles doivent l'être. Commencez avec privé et ajoutez seulement plus de visibilité si nécessaire. Ne rendez public que ce qui est absolument nécessaire à l'utilisateur, chaque détail que vous rendez public restreint votre capacité à repenser le système.
Si vous souhaitez que les utilisateurs soient en mesure de personnaliser les comportements, plutôt que de rendre les internes publics afin qu'ils puissent les remplacer, il est souvent préférable de pousser ces tripes dans un objet et de rendre cette interface publique. De cette façon, ils peuvent simplement brancher un nouvel objet. Par exemple, si vous écriviez un lecteur de CD et que vous vouliez que le bit "aller chercher des informations sur ce CD" soit personnalisable, plutôt que de rendre ces méthodes publiques, vous mettriez toutes ces fonctionnalités dans son propre objet et ne rendriez public que votre getter / setter d'objet . De cette façon, être avare d'exposer vos tripes encourage une bonne composition et une séparation des préoccupations
Personnellement, je reste fidèle à "privé" et "public". De nombreuses langues OO l'ont juste. "Protégé" peut être pratique, mais c'est vraiment une triche. Une fois qu'une interface est plus que privée, elle est hors de votre contrôle et vous devez chercher dans le code des autres pour trouver des utilisations.
C'est là que l'idée de «publié» entre en jeu. Changer une interface (la refactoriser) nécessite que vous trouviez tout le code qui l'utilise et que vous le changiez aussi. Si l'interface est privée, eh bien pas de problème. S'il est protégé, vous devez aller chercher toutes vos sous-classes. Si c'est public, vous devez aller chercher tout le code qui utilise votre code. Parfois, cela est possible, par exemple, si vous travaillez sur un code d'entreprise à usage interne, peu importe si une interface est publique. Vous pouvez récupérer tout le code du référentiel d'entreprise. Mais si une interface est "publiée", s'il y a du code qui l'utilise hors de votre contrôle, alors vous êtes arrosé. Vous devez prendre en charge cette interface ou risquer de casser le code. Même les interfaces protégées peuvent être considérées comme publiées (c'est pourquoi je ne '
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 traits , mais c'est un autre spectacle.
la source
friend
est bon pour définir des relations spéciales entre les classes. Il permet une encapsulation supérieure dans de nombreux cas lorsqu'il est utilisé correctement. Par exemple, il peut être utilisé par une classe d'usine privilégiée pour injecter des dépendances internes dans un type construit. Il a une mauvaise réputation parce que les personnes qui ne se soucient pas de maintenir correctement un modèle d'objet bien conçu peuvent en abuser pour alléger leur charge de travail.Voici une meilleure version du tableau, qui comprend également une colonne pour les modules.
Explications
Un privé membre (
i
est) uniquement accessible au sein de la même classe que elle est déclarée.Un membre sans modificateur d'accès (
j
) n'est accessible que dans les classes du même package.Un membre protégé (
k
) est accessible dans toutes les classes du même package et dans les sous-classes des autres packages.Un membre public (
l
) est accessible à toutes les classes (sauf s'il réside dans un module qui n'exporte pas le package dans lequel il est déclaré).Quel modificateur choisir?
Les modificateurs d'accès sont un outil pour vous aider à empêcher l'encapsulation accidentelle (*) . Demandez-vous si vous souhaitez que le membre soit interne à la classe, au package, à la hiérarchie des classes ou pas du tout interne, et choisissez le niveau d'accès en conséquence.
Exemples:
long internalCounter
doit probablement être privé car il est modifiable et constitue un détail d'implémentation.void beforeRender()
méthode interne appelée juste avant le rendu et utilisée comme hook dans les sous-classes doit être protégée.void saveGame(File dst)
méthode appelée à partir du code GUI doit être publique.(*) Qu'est-ce que l'encapsulation exactement?
la source
la source
protected
modificateur met la chose marquée (classe, méthode ou champ) à la disposition d'une autre classe dans un autre package uniquement si ladite autre classe est une sous-classe de la classe où cette choseprotected
marquée est déclarée.Règle facile. Commencez par déclarer tout privé. Et puis progressez vers le public au fur et à mesure que les besoins se font sentir et que le design le justifie.
Lorsque vous exposez des membres, demandez-vous si vous exposez des choix de représentation ou des choix 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 de surcharger les implémentations de méthodes en sous-classant; c'est trop facile de bousiller la logique. Déclarez les méthodes protégées abstraites si vous avez l'intention de les remplacer.
En outre, utilisez l'annotation @Override lors de la substitution pour empêcher les choses de se casser lorsque vous refactorisez.
la source
C'est en fait un peu plus compliqué qu'une simple grille. La grille vous indique si un accès est autorisé, mais qu'est-ce qui constitue exactement un accès? De plus, les niveaux d'accès interagissent avec les classes imbriquées et l'héritage de manière complexe.
L'accès "par défaut" (spécifié par l'absence de mot-clé) est également appelé package-private . Exception: dans une interface, aucun modificateur ne signifie accès public; les modificateurs autres que publics sont interdits. Les constantes d'énumération sont toujours publiques.
Sommaire
Un accès à un membre avec ce spécificateur d'accès est-il autorisé?
private
: uniquement si le membre est défini dans la même classe que le code appelant.protected
: le même package ou si le membre est défini dans une superclasse de la classe contenant le code appelant.public
: Oui.À quoi s'appliquent les spécificateurs d'accès
Les variables locales et les paramètres formels ne peuvent pas accepter de spécificateurs d'accès. Puisqu'ils sont intrinsèquement inaccessibles à l'extérieur selon les règles de cadrage, ils sont effectivement privés.
Pour les classes de l'étendue supérieure, seuls
public
et package-private sont autorisés. Ce choix de conception est probablement parce queprotected
etprivate
serait redondant au niveau du paquet (il n'y a pas d' héritage de colis).Tous les spécificateurs d'accès sont possibles sur les membres de classe (constructeurs, méthodes et fonctions membres statiques, classes imbriquées).
Connexes: Accessibilité de classe Java
Ordre
Les spécificateurs d'accès peuvent être strictement commandés
ce qui signifie que
public
le plus d'accès,private
le moins. Toute référence possible sur un membre privé est également valable pour un membre package-private; toute référence à un membre package-private est valide sur un membre protégé, etc. (Donner accès aux membres protégés à d'autres classes dans le même package a été considéré comme une erreur.)Remarques
private[this]
.)Classes intérieures
Vous devez également prendre en compte les étendues imbriquées , telles que les classes internes. Un exemple de la complexité est que les classes internes ont des membres, qui peuvent eux-mêmes prendre des modificateurs d'accès. Vous pouvez donc avoir une classe interne privée avec un membre public; le membre est-il accessible? (Voir ci-dessous.) La règle générale consiste à examiner la portée et à réfléchir de manière récursive pour voir si vous pouvez accéder à chaque niveau.
Cependant, c'est assez compliqué, et pour plus de détails, consultez la spécification du langage Java . (Oui, il y a eu des bogues de compilation dans le passé.)
Pour avoir un aperçu de la façon dont ces éléments interagissent, considérez cet exemple. Il est possible de "divulguer" des classes internes privées; c'est généralement un avertissement:
Sortie du compilateur:
Quelques questions connexes:
la source
En règle générale:
private
: portée de la classe.default
(oupackage-private
): étendue du package.protected
:package scope + child
(comme package, mais nous pouvons le sous-classer à partir de différents packages). Le modificateur protégé conserve toujours la relation "parent-enfant".public
: partout.Par conséquent, si nous divisons le droit d'accès en trois droits:
alors nous avons ce tableau simple:
la source
En très court
public
: accessible de partout.protected
: accessible par les classes du même package et les sous-classes résidant dans n'importe quel package.private
: accessible uniquement dans la même classe.la source
Le modificateur d'accès le plus mal compris en Java est
protected
. Nous savons qu'il 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 avons 2 classes;
Father
etSon
, chacun dans son propre package:Ajoutons une méthode protégée
foo()
àFather
.La méthode
foo()
peut être appelée dans 4 contextes:À l'intérieur d'une classe qui se trouve dans le même package où
foo()
est défini (fatherpackage
):Dans une sous-classe, sur l'instance actuelle via
this
ousuper
:Sur une référence dont le type est de la même classe:
Sur une référence dont le type est la classe parente et se trouve à l' intérieur du package où
foo()
est défini (fatherpackage
) [Cela peut être inclus dans le contexte no. 1]:Les situations suivantes ne sont pas valides.
Sur une référence dont le type est la classe parent et se trouve en dehors du package où
foo()
est défini (fatherpackage
):Une non-sous-classe à l'intérieur d'un package d'une sous-classe (Une sous-classe hérite des membres protégés de son parent et les rend privés aux non-sous-classes):
la source
Object#clone()
est un exemple deprotected
membre.super.foo()
et la première situation invalidef.foo()
?protected
. Malheureusement, toutes les autres réponses sur cette page qui définissentprotected
se trompent un peu.Privé
Les méthodes, variables et constructeurs déclarés privés ne sont accessibles que dans la classe déclarée elle-même.
Le modificateur d'accès privé est le niveau d'accès le plus restrictif. La classe et les interfaces ne peuvent pas être privées.
Remarque
Les variables déclarées privées sont accessibles en dehors de la classe si des méthodes getter publiques sont présentes dans la classe. Les variables, méthodes et constructeurs déclarés protégés dans une superclasse ne sont accessibles que par les sous-classes d'un autre package ou par n'importe quelle classe du package de la classe des membres protégés.
Protégé
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.
Remarque
L'accès protégé donne à la sous-classe une chance d'utiliser la méthode ou la variable d'assistance, tout en empêchant une classe non apparentée d'essayer de l'utiliser.
Publique
Une classe, une méthode, un constructeur, une interface, etc. déclarée publique est accessible à partir de n'importe quelle autre classe.
Par conséquent, les champs, méthodes et blocs déclarés à l'intérieur d'une classe publique sont accessibles à partir de n'importe quelle classe appartenant à l'univers Java.
Cependant, si la classe publique à laquelle nous essayons d'accéder se trouve dans un package différent, la classe publique doit toujours être importée.
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.
Mot-clé -No par défaut:
Le modificateur d'accès par défaut signifie que nous ne déclarons pas explicitement un modificateur d'accès pour une classe, un champ, une méthode, etc.
Une variable ou une méthode déclarée sans aucun modificateur de contrôle d'accès est disponible pour toute autre classe du même package. Les champs d'une interface sont implicitement publics statiques et les méthodes d'une interface sont par défaut publiques.
Remarque
Nous ne pouvons pas remplacer les champs statiques.
Réponses associées
Liens de références
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm
la source
La différence se trouve dans les liens déjà fournis, mais celui à utiliser se résume généralement au "Principe de moindre connaissance". N'autorisez que le moins de visibilité nécessaire.
la source
Privé : accès limité à la classe uniquement
Par défaut (pas de modificateur) : accès limité à la classe et au package
Protégé : accès limité aux classes, packages et sous-classes (à l'intérieur et à l'extérieur du package)
Public : accessible aux classes, aux packages (tous) et aux sous-classes ... Bref, partout.
la source
Les modificateurs d'accès sont là pour restreindre l'accès à plusieurs niveaux.
Public: C'est fondamentalement aussi simple que vous pouvez y accéder à partir de n'importe quelle classe, que ce soit dans le même package ou non.
Pour accéder si vous êtes dans le même package, vous pouvez accéder directement, mais si vous êtes dans un autre package, vous pouvez créer un objet de la classe.
Par défaut: il est accessible dans le même package à partir de n'importe quelle classe de package.
Pour y accéder, vous pouvez créer un objet de la classe. Mais vous ne pouvez pas accéder à cette variable en dehors du package.
Protégé: vous pouvez accéder aux variables du même package ainsi qu'aux sous-classes de tout autre package. Donc, fondamentalement, c'est le comportement par défaut + hérité .
Pour accéder au champ protégé défini dans la classe de base, vous pouvez créer un objet de classe enfant.
Privé: il peut être accessible dans la même classe.
Dans les méthodes non statiques, vous pouvez accéder directement à cause de cette référence (également dans les constructeurs) mais pour accéder aux méthodes statiques, vous devez créer un objet de la classe.
la source
Modificateurs d'accès en Java.
Les modificateurs d'accès Java sont utilisés pour fournir un contrôle d'accès en Java.
1. Par défaut:
Accessible aux classes dans le même package uniquement.
Par exemple,
Cet accès est plus restreint que public et protégé, mais moins restreint que privé.
2. Public
Accessible depuis n'importe où. (Accès mondial)
Par exemple,
3. Privé
Accessible uniquement à l'intérieur de la même classe.
Si vous essayez d'accéder aux membres privés d'une classe dans une autre, une erreur de compilation sera générée. Par exemple,
4. Protégé
Accessible uniquement aux classes du même package et aux sous-classes
Par exemple,
la source
public - accessible de n'importe où dans l'application.
par défaut - accessible à partir du package.
protégé - accessible à partir du package et des sous-classes d'un autre package. ainsi que
privé - accessible uniquement depuis sa classe.
la source
Visible sur l'emballage. Le défaut. Aucun modificateur n'est nécessaire.
Visible uniquement en classe ( privé ).
Visible au monde ( public ).
Visible pour le package et toutes les sous-classes ( protégé ).
Les variables et les méthodes peuvent être déclarées sans aucun modificateur appelé. Exemples par défaut:
Modificateur d'accès privé - privé:
Les méthodes, variables et constructeurs déclarés privés ne sont accessibles que dans la classe déclarée elle-même. Le modificateur d'accès privé est le niveau d'accès le plus restrictif. La classe et les interfaces ne peuvent pas être privées.
Les variables déclarées privées sont accessibles en dehors de la classe si des méthodes getter publiques sont présentes dans la classe.
L'utilisation du modificateur privé est le principal moyen par lequel un objet s'encapsule et masque les données du monde extérieur.
Exemples:
Modificateur d'accès public - public:
Une classe, une méthode, un constructeur, une interface, etc. déclarée publique est accessible à partir de n'importe quelle autre classe. Par conséquent, les champs, méthodes, blocs déclarés à l'intérieur d'une classe publique sont accessibles à partir de n'importe quelle classe appartenant à l'univers Java.
Cependant, si la classe publique à laquelle nous essayons d'accéder se trouve dans un package différent, la classe publique doit toujours être importée.
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.
Exemple:
Modificateur d'accès protégé - protégé:
Les variables, méthodes et constructeurs déclarés protégés dans une superclasse ne sont accessibles que par les sous-classes d'un autre package ou n'importe quelle classe du package 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 ou la variable d'assistance, tout en empêchant une classe non apparentée d'essayer de l'utiliser.
la source
Cette page écrit bien sur le modificateur d'accès protégé et par défaut
.... Protégé: Le modificateur d'accès protégé est un peu délicat et vous pouvez dire qu'il s'agit d'un surensemble du modificateur d'accès par défaut. Les membres protégés sont les mêmes que les membres par défaut en ce qui concerne l'accès dans le même package. La différence est que les membres protégés sont également accessibles aux sous-classes de la classe dans laquelle le membre est déclaré qui sont en dehors du package dans lequel la classe parent est présente.
Mais ces membres protégés ne sont «accessibles en dehors du package que par héritage». c'est-à-dire que vous pouvez accéder à un membre protégé d'une classe dans sa sous-classe présente dans un autre package 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 en dehors du package en utilisant la référence de la classe parent. ....
la source
La réponse de David donne la signification de chaque modificateur d'accès. Quant à savoir quand les utiliser, je suggère 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écouvrirez quand rendre certaines classes privées au package et quand déclarer certaines méthodes protégées pour une utilisation dans des sous-classes.
la source
Remarque: Ceci est juste un supplément pour la réponse acceptée.
Ceci est lié aux modificateurs d'accès Java .
Depuis les modificateurs d'accès Java :
Du contrôle de l'accès aux membres d'une classe didacticiels :
la source
Public Protected Default et private sont des modificateurs d'accès.
Ils sont destinés à l'encapsulation, ou à cacher et à afficher le contenu de la classe.
Private n'est pas accessible en dehors de la classe Default n'est accessible que dans le package. Protégé dans le package ainsi que toute classe qui l'étend. Le public est ouvert à tous.
Normalement, les variables membres sont définies comme privées, mais les méthodes membres sont publiques.
la source
Default
n'est pas un modificateur d'accès, et deux des autres sont mal orthographiés.Souvent, j'ai réalisé que se souvenir des concepts de base de n'importe quelle langue peut être rendu 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 étudiant dans une université et que vous avez un ami qui vient vous rendre visite ce week-end. Supposons qu'il existe une grande statue du fondateur de l'université au milieu du campus.
Lorsque vous l'amenez sur le campus, la première chose que vous et votre ami voyez est cette statue. Cela signifie que quiconque se promène sur le campus peut regarder la statue sans la permission de l'université. Cela rend la statue PUBLIQUE .
Ensuite, vous voulez emmener votre ami dans votre dortoir, mais pour cela, vous devez l'enregistrer en tant que visiteur. Cela signifie qu'il obtient un laissez-passer (qui est le même que le vôtre) pour entrer dans divers bâtiments du campus. Cela rendrait sa carte d'accès PROTÉGÉE .
Votre ami veut se connecter au WiFi du campus mais n'a pas les informations d'identification pour le faire. Le seul moyen pour lui de se connecter est de partager votre identifiant avec lui. (N'oubliez pas que chaque étudiant qui fréquente l'université possède également ces identifiants de connexion). Cela rendrait vos informations 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 identifiant pour accéder à cette section du site Web du campus. Cela rendrait ces informations d'identification privées .
J'espère que cela t'aides!
la source
Lorsque vous pensez à des modificateurs d'accès, pensez-y simplement de cette façon (s'applique à la fois aux variables et aux méthodes ):
public
-> accessible de partoutprivate
-> accessible uniquement dans la même classe où il est déclaréMaintenant, la confusion survient en ce qui concerne
default
etprotected
default
-> Aucun mot-clé modificateur d'accès n'est présent. Cela signifie qu'il est disponible strictement dans le package de la classe. Nulle part en dehors de ce package, il est accessible.protected
-> Légèrement moins strictdefault
et en dehors des mêmes classes de package, il est accessible par des sous-classes en dehors du package, il est déclaré.la source
L'accès Java modifie ce que vous pouvez utiliser
Modificateur d'accès peut être applicable
class
,field
[ A propos] ,method
. Essayez d'accéder à cette sous-classe ou de la remplacer.field
oumethod
via unclass
.class
modificateur d'accès successeur (sous-classe) peut être n'importe lequel. Lemethod
modificateur d'accès successeur (prioritaire) doit être le même ou le développerLa classe de niveau supérieur (portée de premier niveau) peut être
public
etdefault
.Nested class
[À propos] peut avoir n'importe lequel d'entre euxpackage
n'est pas applicable à la hiérarchie des packagesModificateurs d'accès rapide
la source
Tout est question d' encapsulation (ou, comme l'a déclaré Joe Phillips, le moins de connaissances ).
Commencez avec le plus restrictif (privé) et voyez si vous avez besoin de modificateurs moins restrictifs plus tard.
Nous utilisons tous des modificateurs de méthode et de membre comme privé, public, ... mais une chose trop peu de développeurs font est d'utiliser des packages pour organiser code de manière logique.
Par exemple: vous pouvez placer des méthodes de sécurité sensibles dans un package de «sécurité». Ensuite, mettez une classe publique qui accède à une partie du code lié à la sécurité dans ce package, mais gardez les autres packages de classes de sécurité privés . Ainsi, les autres développeurs ne pourront utiliser la classe accessible au public que depuis l'extérieur de ce package (à moins qu'ils ne modifient le modificateur). Ce n'est pas une fonction de sécurité, mais guidera l' utilisation.
Une autre chose est que les classes qui dépendent beaucoup les unes des autres peuvent se retrouver dans le même package et pourraient éventuellement être refactorisé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 doit ou ne doit pas être consulté, ce qui peut conduire à écrire beaucoup de javadoc (qui n'applique rien via le compilateur ...).
la source
Le diagramme suivant explique comment les membres de données de la classe de base sont hérités lorsque le mode d'accès aux classes dérivées est privé .
Remarque: La déclaration de membres de données avec un spécificateur d'accès privé est appelée masquage de données.
Source: Spécificateurs d'accès - Privé, public et protégé
la source
Mes deux centimes :)
privé:
classe -> une classe de niveau supérieur ne peut pas être privée. les classes internes peuvent être privées et accessibles à partir de la même classe.
variable d'instance -> accessible uniquement dans la classe. Impossible d'accéder en dehors de la classe.
package-privé:
classe -> une classe de niveau supérieur peut être privée de package. Il ne peut être accessible qu'à partir du même package. Pas du sous-paquet, pas du paquet extérieur.
variable d'instance -> accessible à partir du même package. Pas du sous-paquet, pas du paquet extérieur.
protégé:
classe -> une classe de niveau supérieur ne peut pas être protégée.
variable d'instance -> accessible uniquement dans le même package ou sous-package. Accès uniquement en dehors du package lors de l'extension de la classe.
Publique:
classe -> accessible depuis le package / sous-package / un autre package
variable d'instance -> accessible depuis le package / sous-package / un autre package
Voici la réponse détaillée
https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md
la source
Publique
Si un membre de la classe est déclaré avec public, il est accessible depuis n'importe où
protégé
Si un membre de classe est déclaré avec un mot clé protégé, il est accessible à partir des mêmes membres de classe, des membres de classe externes dans le même package et des membres de classe hérités. Si un membre de classe est protégé, il ne peut PAS être accédé à partir de la classe de package externe à moins que la classe packagée externe soit héritée, c'est-à-dire qu'elle étend l'autre superclasse de package. Mais un membre de classe protégé est toujours disponible pour les mêmes classes de package, peu importe que la même classe de package soit héritée ou NON
défaut
En Java, la valeur par défaut n'est PAS un mot-clé de modificateur d'accès. Si un membre de la classe est déclaré sans mot-clé modificateur d'accès, dans ce cas, il est considéré comme membre par défaut. Le membre de classe par défaut est toujours disponible pour les mêmes membres de classe de package. Mais un membre de classe de package externe ne peut PAS accéder aux membres de classe par défaut même si les classes externes sont des sous-classes contrairement aux membres protégés
privé
Si un membre de classe est déclaré avec un mot-clé protégé, dans ce cas, il est disponible UNIQUEMENT pour les mêmes membres de classe
la source
Spécificateurs d'accès en Java: il existe 4 spécificateurs d'accès en java, à savoir privé, package privé (par défaut), protégé et public dans l'ordre d'accès croissant.
Privé : lorsque vous développez une classe et que vous souhaitez que les membres de cette classe ne soient pas exposés en dehors de cette classe, vous devez la déclarer privée. les membres privés ne sont accessibles que dans la classe où ils sont définis, c'est-à-dire dans la classe englobante. les membres privés sont accessibles sur «cette» référence ainsi que sur d'autres instances de classe entourant ces membres, mais uniquement dans la définition de cette classe.
Package-private (par défaut) : ce spécificateur d'accès fournira l'accès spécifié par le spécificateur d'accès privé en plus de l'accès décrit ci-dessous.
Lorsque vous développez un package et donc une classe (disons Class1), vous pouvez utiliser le spécificateur d'accès par défaut (il n'est pas nécessaire de le mentionner explicitement) pour exposer le membre de la classe à d'autres classes de votre (même) package. Dans ces autres classes (dans le même package), vous pouvez accéder à ces membres par défaut sur l'instance de Class1. Vous pouvez également accéder à ces membres par défaut dans les sous-classes de Class1, par exemple Class2 (sur cette référence ou sur l'instance de Class1 ou sur l'instance de Class2).
Fondamentalement, au sein d'un même package, vous pouvez accéder aux membres par défaut sur l'instance de classe directement ou sur «cette» référence dans les sous-classes.
protected : ce spécificateur d'accès fournira l'accès spécifié par le spécificateur d'accès package-private en plus de l'accès décrit ci-dessous.
Lorsque vous développez un package et donc une classe (par exemple Class1), vous devez utiliser un spécificateur d'accès protégé pour le membre de données dans Class1 si vous ne souhaitez pas que ce membre soit accessible en dehors de votre package (par exemple dans le package du consommateur de votre package, c'est-à-dire le client qui utilise vos API) en général, mais vous voulez faire une exception et autoriser l'accès à ce membre uniquement si le client écrit la classe, par exemple Class2 qui étend Class1. Ainsi, en général, les membres protégés seront accessibles sur «cette» référence dans les classes dérivées, c'est-à-dire Class2 et également sur les instances explicites de Class2.
Notez s'il vous plaît:
Donc, en fin de compte, les membres protégés sont accessibles dans d'autres packages, uniquement si une classe de cet autre package, étend la classe entourant ce membre protégé et le membre protégé est accessible sur «cette» référence ou des instances explicites de classe étendue, dans la définition de étendu classe.
public : ce spécificateur d'accès fournira l'accès spécifié par le spécificateur d'accès protégé en plus de l'accès décrit ci-dessous.
Lorsque vous développez un package et donc une classe (disons Class1), alors vous devez utiliser le spécificateur d'accès public pour le membre de données dans Class1 si vous voulez que ce membre soit accessible dans d'autres packages sur une instance de Class1 créée dans une classe d'autres paquet. Fondamentalement, ce spécificateur d'accès doit être utilisé lorsque vous avez l'intention d'exposer votre membre de données au monde sans aucune condition.
la source