web-dev-qa-db-fra.com

Accéder aux variables d'instance privées du parent à partir de la classe enfant?

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. 

21
lfaraone

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);
24
Wim Coenen

Non, pour cela vous devriez utiliser protected.

21
RichieHindle

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.

6
Sandro

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.

1
Sushim Mukul Dutta

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é). 

1
alphazero

... 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 ..

1
ivmos

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.

1
George Armhold

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é"

0
neeranzan