Disons que nous avons une classe foo
qui a une variable d'instance privée bar
.
Maintenant, laissez-nous une autre classe, baz
, qui extends foo
. Les méthodes non statiques de baz
peuvent-elles accéder à la variable foo
de bar
s'il n'existe aucune méthode d'accès définie dans foo
?
Je travaille en Java, au fait.
Non, pas conformément à la spécification du langage Java, 3ème édition :
6.6.8 Exemple: champs privés, méthodes et constructeurs
Un privé Le membre de la classe ou le constructeur est accessible uniquement dans le corps de la classe de niveau supérieur (§7.6) qui inclut la déclaration du membre ou constructeur. Il n’est pas hérité par sous-classes.
Mais quelle que soit cette restriction linguistique, vous pouvez _ accéder aux champs privés par réflexion :
Field privateStringField =
MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
Non, pour cela vous devriez utiliser protected.
Pour des questions de ce type, où se trouve un tableau sur le site Web ici: http://Java.Sun.com/docs/books/tutorial/Java/javaOO/accesscontrol.html
En gros, vous voulez que les variables publiques ou protégées soient déclarées dans foo, car ce sont les variables que les sous-classes héritent de leur parent et sont donc visualisées dans baz.
Pour utiliser une variable privée d'une super classe dans une sous-classe, une méthode d'accès est requise. Sinon, utilisez le modificateur protected au lieu de private.
Les classes enfants ne peuvent pas accéder aux membres privés (ce qui constitue le point entier du contrôle d'accès privé).
... s'il n'y a pas de méthode d'accès définie dans foo?
Vous avez besoin d'accesseurs. De plus, prenez soin de l'héritage, ce var devrait-il vraiment être dans le parent? Rappelez-vous IS-A chèque ..
Vous ne pouvez pas accéder aux variables privées dans les classes descendantes. Normalement, vous voudrez utiliser un accès de niveau "protégé" ou "package" (par défaut) pour cela. Cependant, si vous voulez être vraiment difficile, vous pouvez utiliser la réflexion et AccessibleObject pour y arriver . Je ne le recommanderais pas pour le code de production, sauf si vous êtes vraiment dans une impasse; pour les tests, etc., c'est bien.
La ou les variables privées d'une classe ont invariablement une portée à l'intérieur de cette classe. S'il doit être partagé entre les sous-classes, il doit être déclaré "protégé"