Question

Supposons que nous avons une classe toto qui a une variable d'instance privée bar .

Maintenant, prenons une autre classe, baz , laquelle étend foo . Des méthodes non statiques dans baz peuvent-elles accéder à la variable foo de foo s'il n'y a pas de méthode d'accesseur définie dans foo ?

Je travaille en Java, au fait.

Était-ce utile?

La solution

Non, pas selon la langue java spécification, 3ème édition :

  

6.6.8 Exemple: champs privés, méthodes et constructeurs

     

Un privé   membre de la classe ou constructeur est   accessible que dans le corps de la   classe de niveau supérieur (§7.6) qui comprend   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);

Autres conseils

Non, pour cela, vous devez 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 visibles dans baz.

Les classes enfants ne peuvent pas accéder aux membres privés (ce qui constitue le point entier du contrôle de l'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 en parent? N'oubliez pas de vérifier IS-A ..

Vous ne pouvez pas accéder aux variables privées dans les classes descendantes. Normalement, vous souhaitez utiliser " protected " ou " colis " (par défaut) accès de niveau pour cela. Toutefois, si vous voulez être vraiment difficile, vous pouvez utiliser la réflexion et AccessibleObject pour y accéder. Je ne recommanderais pas cela pour le code de production, sauf si vous êtes vraiment dans une impasse; pour les tests, etc., c'est bon.

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 variables privées d'une classe ont toujours 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é"

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top