Java statische Methoden den Zugriff auf private Variablen
War ich unter dem Eindruck, dass eine private, nicht-statische Variablen können nur zugegriffen werden, indem die Methoden für das Objekt aufgerufen, dass die Variablen befinden, dies ist jedoch nicht der Fall. Könnte jemand bitte erklären Sie die Gründe, warum die folgenden kompiliert und läuft?
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);
}
}
Ausgabe:
modified
EDIT: Das gleiche gilt in C#.
Sie könnte sich geändert haben
_privateString
direkt von der main()
als Ihr in der gleichen Klasse.InformationsquelleAutor T.K. | 2011-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Private member-Variablen der Klasse A zugegriffen werden kann (also Lesen/schreiben) von alle Methode der Klasse A (statisch oder nicht-statisch), also in deinem Beispiel, da die Methode Veränderung der Zeichenkette ist eine Methode der gleichen Klasse das Mitglied angehört, ist es gewährt Zugriff auf die variable.
Der Grund ist, weil eine Klasse wird als ein in sich abgeschlossener Körper der Logik (D. H. eine spezifische Implementierung), so macht es Sinn, dass der Datenschutz innerhalb einer Klasse, obwohl es keinen Grund gibt, um auszuschließen, statische Methoden aus, dass der Zugriff Recht, denn auch Sie sind Teil der konkreten Umsetzung bietet die Klasse.
Genau! Die auf den ersten scheinen mag seltsam, obwohl macht Sinn, wenn Sie darüber nachdenken, es in Bezug auf eine Klasse einer einzigen Implementierung.
So zum Beispiel
public void changeOther(String changeTo, Sandbox s) { s._privateString=changeTo; }
ausgeführt werden können auf eine andere Instanz insgesamt:s1.changeOther("blah", s2);
Okay. Gibt es ein Entwurfsmuster, das würde die Durchsetzung der Regel, nur die Instanz, an die eine variable
a
gehört zugreifen könnena
? Oder sollte ich bitten, dass in einer anderen Frage, anstatt in einem Kommentar, und öffnen Sie sich für mehr Menschen zu beantworten?Wahrscheinlich eine gute Idee
InformationsquelleAutor davin
Wie bereits in einigen anderen Beiträgen, Java die Sichtbarkeit der system-Klasse-basiert, nicht Objekt-basiert.
Beachten Sie, dass diese verwertet wird, in den compiler: Bei geschachtelten Klassen und Zugriff auf ein private Feld der äußeren Klasse, eine öffentliche synthetischen statische Methode generiert wird, um den Zugang zu ermöglichen. Es ist in der Regel mit dem Namen "access$0" usw. Sie können erstellen Sie ein bytecode, das gegen encaplulation ohne die Reflection-API durch die Verwendung dieser synthetischen Methoden. Sie können auch den Zugriff auf Sie aus der Reflection-API, ohne dass der Zugriff auf private member. Viele verrückte Dinge getan werden kann...
Wenn es nicht solche Sichtbarkeit-system, compiler wohl brauchen würde, um es zu kompilieren elsehow.
... Hoewver, Ende-Programmierer in der Regel brauchen nicht zu wissen, dieses detail. IDEs beinhalten keine synthetischen Methoden in der code-Vervollständigung und ich hoffe, dass Compiler (außer Jasmin) nicht erlauben, Sie zu nutzen. Also, wenn Sie nicht generieren von bytecode und nicht die Verwendung der Reflection-API und ignorieren Sie diese Methoden in der stacktrace, Sie wahrscheinlich nicht brauchen, zu wissen, dieses detail.
InformationsquelleAutor v6ak
Scheinen Sie zu verwirren
visibility
mitscope
. Die Instanz-Variablen werden im Rahmen einer Instanz, so dass Sie nicht zugegriffen werden kann, in der eine statische Methode direkt, sondern nur mit einer Instanz reference qualifier:s._privateString
in Ihrem Fall.Jedoch, dies bedeutet nicht, dass die Instanz-Variablen sind nicht sichtbar für eine statische Methode in der gleichen Klasse, wie
private
bedeutet sichtbar in der Klasse (für jedes Mitglied mit jedem Rahmen).InformationsquelleAutor Costi Ciudatu
Die Regel ist einfach. Member-Methoden einer Klasse können acesss und ändern private Mitglieder derselben Klasse unabhängig von Ihrer Sichtbarkeit Modifikatoren.
InformationsquelleAutor Feisty Mango