Wenn eine Variable als deklariert ist public static varName;
, kann ich von überall als darauf zugreifenClassName.varName
. Mir ist auch bekannt, dass statische Mitglieder von allen Instanzen einer Klasse gemeinsam genutzt und nicht in jeder Instanz neu zugewiesen werden.
Bekannt , dass folgende eine Variable als private static varName;
jede andere von Deklaration einer Variablen private varName;
?
In beiden Fällen kann nicht als ClassName.varName
oder als zugegriffen werdenClassInstance.varName
von einer anderen Klasse .
Gibt die Deklaration der Variablen als statisch andere besondere Eigenschaften?
Antworten:
Natürlich kann darauf zugegriffen werden als
ClassName.var_name
, aber nur innerhalb der Klasse, in der es definiert ist - das liegt daran, dass es als definiert istprivate
.public static
oderprivate static
Variablen werden häufig für Konstanten verwendet. Zum Beispiel mögen viele Leute es nicht, Konstanten in ihrem Code "hart zu codieren"; Sie möchten einepublic static
oder eineprivate static
Variable mit einem aussagekräftigen Namen erstellen und diesen in ihrem Code verwenden, wodurch der Code besser lesbar wird. (Sie sollten auch solche Konstanten erstellenfinal
).Beispielsweise:
Ob Sie es schaffen
public
oderprivate
davon abhängen, ob die Variablen außerhalb der Klasse sichtbar sein sollen oder nicht.quelle
ClassName.var_nam
? Wo ich direkt darauf zugreifen kann:var_nam
innerhalb der KlasseStatische Variablen haben einen einzigen Wert für alle Instanzen einer Klasse.
Wenn Sie etwas machen würden wie:
und dann wolltest du deinen Namen ändern, das ist in Ordnung, mein Name bleibt gleich. Wenn Sie es jedoch so ändern wollten, dass Sie 17 Augen hatten, dann hätte jeder auf der Welt auch 17 Augen.
quelle
Private statische Variablen sind genauso nützlich wie private Instanzvariablen: Sie speichern den Status, auf den nur durch Code innerhalb derselben Klasse zugegriffen wird. Die Zugänglichkeit (privat / öffentlich / usw.) und die Instanz / statische Natur der Variablen sind vollständig orthogonale Konzepte.
Ich würde es vermeiden, statische Variablen als von "allen Instanzen" der Klasse gemeinsam zu betrachten - das bedeutet, dass es mindestens eine Instanz geben muss, damit der Status vorhanden ist. Nein - eine statische Variable ist dem Typ selbst anstelle einer beliebigen zugeordnet Instanzen des Typs.
Wenn Sie also einen Status wünschen, der dem Typ und nicht einer bestimmten Instanz zugeordnet ist, und diesen Status privat halten möchten (z. B. möglicherweise einen kontrollierten Zugriff über Eigenschaften zulassen), ist es sinnvoll, eine private statische Variable zu haben.
Abgesehen davon würde ich dringend empfehlen, dass der einzige Variablentyp, den Sie öffentlich (oder sogar nicht privat) machen, Konstanten sind - statische Endvariablen unveränderlicher Typen. Alles andere sollte privat sein, um API und Implementierung (unter anderem) zu trennen.
quelle
Nun, Sie haben Recht, öffentliche statische Variablen werden verwendet, ohne eine Instanz der Klasse zu erstellen, private statische Variablen jedoch nicht. Der Hauptunterschied zwischen ihnen und der Verwendung der privaten statischen Variablen besteht darin, dass Sie eine Variable in einer statischen Funktion verwenden müssen. Für die statischen Funktionen können Sie nur statische Variablen verwenden, sodass Sie sie privat machen, um nicht von anderen Klassen auf sie zuzugreifen. Dies ist der einzige Fall, für den ich private statische Daten verwende.
Hier ist ein Beispiel:
quelle
Person
, wäre dies wahrscheinlich ein Fehler, da Sie nicht mehrere Personen unterschiedlichen Alters haben könnten (wenn dies ein beabsichtigter Anwendungsfall wäre).Nun,
private static
Variablen können verwendet werden, um Daten über Instanzen dieser Klasse hinweg gemeinsam zu nutzen. Sie haben zwar Recht, dass wir nichtprivate static
mit Konstrukten wieClassName.member
oder auf die Variablen zugreifen können,ClassInstance.member
aber das Mitglied ist immer über Methoden dieser Klasse oder Instanzen dieser Klasse sichtbar. In der Tat können Instanzen dieser Klasse immer auf ein Mitglied verweisen.quelle
Was ist die Verwendung einer privaten statischen Klassenvariablen?
Angenommen, Sie haben eine Bibliotheksbuchklasse. Jedes Mal, wenn Sie ein neues Buch erstellen, möchten Sie ihm eine eindeutige ID zuweisen. Eine Möglichkeit besteht darin, einfach bei 0 zu beginnen und die ID-Nummer zu erhöhen. Aber woher kennen alle anderen Bücher die zuletzt erstellte ID-Nummer? Einfach, speichern Sie es als statische Variable. Müssen Benutzer wissen, dass die tatsächliche interne ID-Nummer für jedes Buch gilt? Nein, diese Informationen sind privat.
Dies ist ein erfundenes Beispiel, aber ich bin sicher, Sie können sich leicht Fälle vorstellen, in denen alle Klasseninstanzen Zugriff auf allgemeine Informationen haben sollen, die von allen anderen privat gehalten werden sollten. Oder selbst wenn Sie nicht können, ist es eine gute Programmierpraxis, die Dinge so privat wie möglich zu gestalten. Was wäre, wenn Sie dieses numBooks-Feld versehentlich öffentlich gemacht hätten, obwohl Buchbenutzer nichts damit anfangen sollten? Dann könnte jemand die Anzahl der Bücher ändern, ohne ein neues Buch zu erstellen.
Sehr hinterhältig!
quelle
Ja, beide sind unterschiedlich. Und der erste wird aufgerufen,
class variable
weil er dafür einen einzelnen Wert enthält,class
während der andere aufgerufen wird,instance variable
weil er für verschiedene Werte unterschiedliche Werte enthalten kanninstances(Objects)
. Die erste wird nur einmal in jvm erstellt und die andere wird einmal pro Instanz erstellt. Wenn Sie also 10 Instanzen haben, haben Sie 10 verschiedeneprivate varName;
in jvm.Ja, statische Variablen erhalten andere Eigenschaften als normale Instanzvariablen. Ich habe bereits einige erwähnt und lassen Sie uns hier einige sehen:
class variables
(Instanzvariablen, die als statisch deklariert sind) können direkt unter Verwendung des Klassennamens wie aufgerufen werdenClassName.varName
. Und jedes Objekt dieser Klasse kann auf seinen Wert zugreifen und ihn ändern, im Gegensatz zu Instanzvariablen, auf die nur die jeweiligen Objekte zugreifen. Klassenvariablen können in statischen Methoden verwendet werden.Logischerweise unterscheidet
private static variable
es sich nicht vonpublic static variable
dem ersten, der Ihnen mehr Kontrolle gibt. IMO, können Sie buchstäblich ersetzenpublic static variable
durchprivate static variable
mit Hilfe vonpublic static
Getter und Setter - Methoden.Ein weit verbreiteter Bereich
private static variable
ist die Implementierung eines einfachenSingleton
Musters, bei dem Sie nur eine einzige Instanz dieser Klasse auf der ganzen Welt haben. Hierstatic
spielt der Bezeichner eine entscheidende Rolle, damit diese einzelne Instanz für die Außenwelt zugänglich ist (natürlich spielt auch die öffentliche statische Getter-Methode die Hauptrolle).quelle
Das private Schlüsselwort wird für den Variablenzugriff innerhalb der Klasse verwendet und bleibt statisch in dem Sinne, dass wir auch auf die Variable in der statischen Methode zugreifen können, aber die Referenzvariable kann nicht auf die statische Methode zugreifen.
quelle
Eine andere Perspektive:
quelle
Wenn Sie in einer statischen Methode eine Variable verwenden, muss die Variable beispielsweise auch statisch sein:
quelle
Statische Variablen sind diejenigen Variablen, die für alle Instanzen einer Klasse gleich sind. Wenn eine Instanz sie ändert, wird der Wert der statischen Variablen für alle anderen Instanzen aktualisiert
quelle
Für einige Leute ist dies sinnvoller, wenn sie es in verschiedenen Sprachen sehen. Deshalb habe ich auf meiner Seite ein Beispiel in Java und PHP geschrieben, in dem ich einige dieser Modifikatoren erkläre. Möglicherweise denken Sie falsch darüber nach.
Sie sollten sich meine Beispiele ansehen, wenn es unten keinen Sinn ergibt. Gehen Sie hier http://www.siteconsortium.com/h/D0000D.php
Das Fazit ist jedoch, dass es ziemlich genau das ist, was es sagt. Es ist eine statische Mitgliedsvariable, die privat ist. Wenn Sie beispielsweise ein Singleton-Objekt erstellen möchten, warum sollten Sie die Variable SingletonExample.instance öffentlich machen? Wenn Sie dies getan haben, könnte eine Person, die die Klasse verwendet, den Wert leicht überschreiben.
Das ist alles was es ist.
quelle
Wenn Sie in Ihrer Klasse private statische Variablen verwenden, können statische innere Klassen in Ihrer Klasse Ihre Variablen erreichen. Dies ist perfekt für die Kontextsicherheit.
quelle
Wenn eine Variable als public static definiert ist, kann von jeder Klasse aus über ihren Klassennamen auf sie zugegriffen werden.
Normalerweise werden Funktionen als öffentliche statische Elemente definiert, auf die nur durch Aufrufen des implementierenden Klassennamens zugegriffen werden kann.
Ein sehr gutes Beispiel dafür ist die
sleep()
Methode in der Thread-KlasseWenn eine Variable als private statische Variable definiert ist, kann nur innerhalb dieser Klasse auf sie zugegriffen werden, sodass kein Klassenname erforderlich ist, oder Sie können den Klassennamen (bis zu Ihnen) weiterhin verwenden. Der Unterschied zwischen privatem Variablennamen und privatem statischem Variablennamen besteht darin, dass auf private statische Variablen nur mit statischen Methoden der Klasse zugegriffen werden kann, während auf private Variablen mit jeder Methode dieser Klasse zugegriffen werden kann (außer mit statischen Methoden).
Ein sehr gutes Beispiel hierfür ist das Definieren von Datenbankverbindungen oder Konstanten, bei denen Variablen als private statische Werte deklariert werden müssen.
Ein weiteres häufiges Beispiel ist
quelle
Ich bin neu in Java, aber eine Möglichkeit, statische Variablen zu verwenden, wie ich davon ausgehe, dass viele Leute dies tun, besteht darin, die Anzahl der Instanzen der Klasse zu zählen. z.B:
Dann können Sie sysout:
Sie können auch von jeder Instanz der Klasse auf numCompanies zugreifen (was ich nicht vollständig verstehe), aber es wird nicht "statisch" sein. Ich habe keine Ahnung, ob dies die beste Vorgehensweise ist oder nicht, aber es macht für mich Sinn.
quelle
*) Wenn eine Variable als privat deklariert ist, ist sie außerhalb der Klasse nicht sichtbar. Dies wird als Datahiding bezeichnet.
*) Wenn eine Variable als statisch deklariert ist, ist der Wert der Variablen für alle Instanzen gleich und wir müssen kein Objekt erstellen, um diese Variable aufzurufen. Wir können diese Variable einfach aufrufen
classname.variablename;
quelle
Private statische Variablen werden auch in der Unterklasse gemeinsam genutzt. Wenn Sie in einer Unterklasse geändert haben und die andere Unterklasse den geänderten Wert erhält, entspricht dieser möglicherweise nicht Ihren Erwartungen.
quelle
ThreadLocal
Variablen werden normalerweise als implementiertprivate static
. Auf diese Weise sind sie nicht an die Klasse gebunden und jeder Thread hat seinen eigenen Verweis auf sein eigenes "ThreadLocal" -Objekt.quelle
Im folgenden Beispiel
eye
wird von PersonB geändert, während es gleichleg
bleibt. Dies liegt daran, dass eine private Variable eine Kopie von sich selbst in die Methode erstellt, sodass ihr ursprünglicher Wert gleich bleibt. Während ein privater statischer Wert nur eine Kopie für alle zu teilenden Methoden enthält, ändert das Bearbeiten seines Werts seinen ursprünglichen Wert.}}
quelle