2008-11-06 9 views
2

Quelle est la différence dans l'accessibilité des variables suivantes dans Java?Accessibilité de variable d'instance Java

public class Joe { 
    public int a; 
    protected int b; 
    private int b; 
    int c; 
} 

Ce qui m'intéresse le plus, c'est ce qui m'intéresse le plus.

+0

DUPE: http://stackoverflow.com/questions/215497/in-java-whats-the-difference-between-public-default-protected-and-private –

Répondre

9
  • public: lecture/écriture pour tous ceux qui
  • protégé: lecture/écriture pour cas de sous-classes et à l'intérieur du paquet englobante
  • privé: lecture/écriture pour toute instance de la classe et instance interne ou externe (englobante)
  • int c: paquet-privé, lecture/écriture pour toutes les classes dans le même paquet

Voir la JLS pour plus de détails

EDIT: Ajout le commentaire indiquant que l'accès protégé est accordé à l'intérieur même paquet, les gars vous êtes tout à fait raison. Aussi ajouté un commentaire pour privé. Je me souviens maintenant ... ;-)

+0

Je crois que vous avez tort à propos de protected. En Java, protected signifie package-private. C'est le C# équivalent à interne – JaredPar

+0

Non, il est absolument _right_ sur le protégé et r/w pour les sous-classes.dhiller a même fourni un lien vers la spécification de la langue où il est expliqué en détail. – boutta

+0

Lire attentivement la spécification, cela signifie que le type de l'instance doit être une classe ou une sous-classe. Il ne fait aucune remarque d'où l'instance de type est utilisée. – JaredPar

0

Et tous ces éléments sont des protections de temps de compilation, ils peuvent être facilement remplacés par la réflexion à l'exécution.

+0

À moins que le SecurityManager ne dise le contraire;) – VonC

1

J'essaie d'éviter complètement l'accès au niveau du paquet (le dernier accès que vous mentionnez).

J'aime garder les cours en toute autonomie. Si une autre classe a besoin d'accéder à quelque chose dans ma classe, elle devrait être publique (et cela devrait être une méthode, pas un attribut). Sinon, je pense que vous avez cassé encapsulation, comme expliqué dans Abstraction VS Information Hiding VS Encapsulation.

+0

Parfois, le paquet-privé est pratique pour les tests unitaires. Mais fondamentalement, je pense que vous avez raison. – WMR

+0

@WMR: à droite, mais on pourrait soutenir que les tests unitaires pourraient utiliser Reflection pour accéder à des données privées ou tester des méthodes protégées/privées ... (si le SecurityManager le permet) – VonC

+0

Package-private devrait être la valeur par défaut pour les classes de niveau supérieur et les interfaces. Ce sont certaines situations rares où cela est approprié (en l'absence d'amis). –

2

Désolé pour répondre à des corrections à une réponse précédente, mais je n'ai pas assez réputation de modifier directement ...

  • public - lecture/écriture pour tous ceux qui
  • protégé - lecture/écriture pour cas toutes les classes et sous-classes intérieur même package
  • int c: package-privé, lecture/écriture pour toutes les classes à l'intérieur même package
  • privé - lire/écrire pour n'importe quel membre de cette classe et classes internes (le cas échéant)

Il est préférable de commander les modificateurs d'accès de cette façon, du plus large accès (public) au plus étroit (privé), sachant que lorsque vous passez de étroit à large, vous ne perdez aucune possibilité. Ceci est particulièrement important pour "protected", où il est souvent mal compris que les classes d'un même package peuvent également accéder aux membres protégés d'une classe (pas seulement ses sous-classes).

Questions connexes