Méthodes statiques Java accédant aux variables privées
J'étais sous l'impression que privé non statiques et variables, peuvent n'être accessibles que par des méthodes appelée sur l'objet que les variables se trouvent dans, mais ce n'est pas le cas. Quelqu'un pourrait-il expliquer le raisonnement derrière pourquoi la suivante compile et s'exécute?
public class Sandbox {
private String _privateString = "unmodified";
public static void setPrivateString(String str, Sandbox s) {
s._privateString = str;
}
public String toString()
{
return _privateString;
}
public static void main(String[] args) {
Sandbox s = new Sandbox();
setPrivateString("modified", s);
System.out.println(s);
}
}
De sortie:
modified
EDIT: La même chose est vraie en C#.
source d'informationauteur T.K.
Vous devez vous connecter pour publier un commentaire.
Privé variables membres de la classe A peut être consultée (lu/écrit) par tout méthode de classe (statiques ou non statique), donc dans votre exemple, car la méthode de modification de la chaîne de caractères est une méthode de la même classe appartient le membre, il est autorisé à accéder à la variable.
La raison en est parce qu'une classe est considérée comme un corps de logique (c'est à dire une mise en œuvre spécifique), il est donc logique que la vie privée est contenue à l'intérieur d'une classe, bien qu'il n'y a pas de raison d'exclure les méthodes statiques à partir de ce droit d'accès, car ils sont aussi le cadre de la mise en œuvre spécifique de la classe.
Comme indiqué dans d'autres posts, Java visibilité du système est basé sur une classe, pas un objet.
Noter que c'est utilisé dans le compilateur: Quand vous avez des classes imbriquées et vous avez accès à une zone privée de l'extérieur de la classe, un public synthétique de la méthode statique est générée pour autoriser l'accès. Il est généralement nommé "accès$0" etc. Vous pouvez créer un bytecode qui viole encaplulation sans la Réflexion de l'API à l'aide de ces méthodes de synthèse. Vous pouvez également y accéder à partir de l'API Reflection sans permettre l'accès aux membres privés. Beaucoup de choses folles qui peut être fait...
Si il n'y avait pas un tel système de visibilité, le compilateur aurait probablement besoin de le compiler elsehow.
... Hoewver, le programmeur n'est généralement pas nécessaire de connaître ce détail. IDEs de ne pas inclure de méthodes de synthèse dans la complétion de code et j'espère que les compilateurs (à l'exception de Jasmin) ne vous permettra pas de l'utiliser. Donc, si vous n'avez pas de générer du bytecode et n'utilise pas la Réflexion de l'API et vous ignorez ces méthodes dans le stacktrace, vous n'avez probablement pas besoin de connaître ce détail.
Vous semblez être source de confusion
visibility
avecscope
. Les variables d'instance sont à la portée de l'instance, de sorte qu'ils ne peuvent pas être accessible dans une méthode statique directement, mais seulement avec une instance du qualificatif de référence:s._privateString
dans votre cas.Toutefois, cela ne signifie pas que les variables d'instance sont pas visible pour une méthode statique à l'intérieur de la même classe, comme
private
signifie visible à l'intérieur de la classe (pour chaque etat membre, avec toute la portée).La règle est simple. Membre des méthodes d'une classe peuvent acesss et modifier privé des membres de la même classe, quel que soit leur modificateurs de visibilité.