Um genau zu sein, habe ich diesen Code ausprobiert:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
Aber es gab den Fehler
Kein Zugriff auf nicht statisches Feld in der statischen Methode main
Also habe ich die Erklärung dahingehend geändert clock
:
static Clock clock = new Clock();
Und es hat funktioniert. Was bedeutet es, dieses Schlüsselwort vor die Deklaration zu setzen? Was genau wird es tun und / oder einschränken, was mit diesem Objekt getan werden kann?
java
static
oop
language-features
restriction
Klicken Sie auf Upvote
quelle
quelle
Antworten:
static
Mitglieder gehören der Klasse anstelle einer bestimmten Instanz an.Dies bedeutet, dass nur eine Instanz eines
static
Felds vorhanden ist [1], selbst wenn Sie eine Million Instanzen der Klasse erstellen oder keine. Es wird von allen Instanzen geteilt.Da
static
Methoden auch nicht zu einer bestimmten Instanz gehören, können sie nicht auf Instanzmitglieder verweisen. Weiß im angegebenen Beispielmain
nicht, auf welche Instanz derHello
Klasse (und damit auf welche Instanz derClock
Klasse) sie sich beziehen soll.static
Mitglieder können sich nur aufstatic
Mitglieder beziehen . Instanzmitglieder können natürlich aufstatic
Mitglieder zugreifen .Randnotiz: Natürlich
static
können Mitglieder über eine Objektreferenz auf Instanzmitglieder zugreifen .Beispiel:
[1]: Abhängig von den Laufzeitmerkmalen kann es eine pro ClassLoader oder AppDomain oder Thread sein, aber das ist nebensächlich.
quelle
Dies bedeutet, dass es in Hello nur eine Instanz von "clock" gibt, nicht eine für jede einzelne Instanz der "Hello" -Klasse, oder mehr, dass es unter allen Instanzen von eine gemeinsame "clock" -Referenz gibt die "Hallo" Klasse.
Wenn Sie also irgendwo in Ihrem Code ein "neues Hallo" machen würden: A- Im ersten Szenario (vor der Änderung, ohne "statisch" zu verwenden) würde jedes Mal, wenn ein "neues Hallo" aufgerufen wird, eine neue Uhr erstellt. Aber B- im zweiten Szenario (nach der Änderung mit "statisch") würde jede "neue Hallo" -Instanz weiterhin die ursprüngliche und dieselbe "Uhr" -Referenz gemeinsam nutzen und verwenden, die zuerst erstellt wurde.
Wenn Sie nicht irgendwo außerhalb der Hauptleitung eine "Uhr" benötigen, funktioniert dies genauso gut:
quelle
main()
Routine sollte in sich geschlossen sein.main
Methode nur verwendet , weil das OP dies tat. Wenn es sich stattdessen um eine öffentliche Methode handelte, die von einer anderen Stelle aufgerufen wurde, und die Hello-Klasse mehr als einmal instanziiert wurde, konnte für jede Hello-Instanz eine Clock-Instanz erstellt werden, sofern diese nichtclock
statisch war.Das
static
Schlüsselwort bedeutet, dass etwas (ein Feld, eine Methode oder eine verschachtelte Klasse) eher mit dem Typ als mit einer bestimmten Instanz des Typs zusammenhängt. So ruft man beispielsweiseMath.sin(...)
ohne Instanz derMath
Klasse auf, und tatsächlich kann man keine Instanz derMath
Klasse erstellen .Weitere Informationen finden Sie im entsprechenden Teil des Java-Tutorials von Oracle .
Randnotiz
Mit Java können Sie leider auf statische Mitglieder zugreifen, als wären sie Instanzmitglieder, z
Das sieht so aus, als wäre
sleep
es eine Instanzmethode, aber es ist tatsächlich eine statische Methode - der aktuelle Thread wird immer in den Ruhezustand versetzt. Es ist besser, dies im aufrufenden Code klar zu machen:quelle
System.out
nicht gefällt.Das
static
Schlüsselwort in Java bedeutet, dass die Variable oder Funktion von allen Instanzen dieser Klasse gemeinsam genutzt wird, da sie zum Typ gehört , nicht von den tatsächlichen Objekten selbst.Wenn Sie also eine Variable haben:
private static int i = 0;
und siei++
in einer Instanz inkrementieren ( ), wird die Änderung in allen Instanzen wiedergegeben.i
wird jetzt in allen Fällen 1 sein.Statische Methoden können verwendet werden, ohne ein Objekt zu instanziieren.
quelle
Grundlegende Verwendung statischer Elemente ...
Auf diese Weise können Sie Werte für alle Klassenmitglieder freigeben, ohne die Klasseninstanz Hello an eine andere Klasse zu senden. Und mit statischer Aufladung müssen Sie keine Klasseninstanz erstellen.
Sie können statische Werte oder Methoden einfach nach Klassennamen aufrufen:
quelle
Statisch bedeutet, dass Sie keine Instanz der Klasse erstellen müssen, um die der Klasse zugeordneten Methoden oder Variablen zu verwenden. In Ihrem Beispiel könnten Sie anrufen:
direkt statt:
Innerhalb einer statischen Methode (die zu einer Klasse gehört) können Sie nicht auf Mitglieder zugreifen, die nicht statisch sind, da ihre Werte von Ihrer Instanziierung der Klasse abhängen. Ein nicht statisches Clock-Objekt, das ein Instanzmitglied ist, hat für jede Instanz Ihrer Hello-Klasse einen anderen Wert / eine andere Referenz. Daher können Sie nicht über den statischen Teil der Klasse darauf zugreifen.
quelle
Statisch in Java:
Static ist ein Modifikator ohne Zugriff. Das statische Schlüsselwort gehört zur Klasse als Instanz der Klasse. kann verwendet werden, um eine Variable oder Methode an eine Klasse anzuhängen.
Das statische Schlüsselwort kann verwendet werden mit:
Methode
Variable
Klasse in einer anderen Klasse verschachtelt
Initialisierungsblock
Kann nicht verwendet werden mit:
Klasse (nicht verschachtelt)
Konstrukteur
Schnittstellen
Methode Lokale innere Klasse (Differenz dann verschachtelte Klasse)
Methoden der inneren Klasse
Instanzvariablen
Lokale Variablen
Beispiel:
Stellen Sie sich das folgende Beispiel mit einer Instanzvariablen namens count vor, die im Konstruktor inkrementiert wurde:
Ausgabe:
Da die Instanzvariable zum Zeitpunkt der Objekterstellung den Speicher erhält, verfügt jedes Objekt über die Kopie der Instanzvariablen. Wenn sie inkrementiert wird, wird sie nicht auf andere Objekte übertragen.
Wenn wir nun die Anzahl der Instanzvariablen in eine statische ändern, erzeugt das Programm eine andere Ausgabe:
Ausgabe:
In diesem Fall erhält die statische Variable den Speicher nur einmal. Wenn ein Objekt den Wert der statischen Variablen ändert, behält es seinen Wert bei.
Statisch mit Finale:
Die globale Variable, die als endgültig und statisch deklariert ist, bleibt für die gesamte Ausführung unverändert. Denn statische Elemente werden im Klassenspeicher gespeichert und in der gesamten Ausführung nur einmal geladen. Sie sind allen Objekten der Klasse gemeinsam. Wenn Sie statische Variablen als endgültig deklarieren, kann keines der Objekte seinen Wert ändern, da er endgültig ist. Daher werden als endgültig und statisch deklarierte Variablen manchmal als Konstanten bezeichnet. Alle Felder von Schnittstellen werden als Konstanten bezeichnet, da sie standardmäßig endgültig und statisch sind.
Bildressource: Endgültig statisch
quelle
Lassen Sie mich mit einem Bild versuchen, um vorhandene Antworten zu ergänzen:
Auf ALLE Sparkonten wird ein Zinssatz von 2% angewendet. Daher ist es statisch .
Ein Gleichgewicht sollte individuell sein , damit es nicht statisch ist.
quelle
Diese Diskussion hat bisher Überlegungen zum Klassenladeprogramm ignoriert. Genau genommen werden statische Java-Felder von allen Instanzen einer Klasse für einen bestimmten Klassenladeprogramm gemeinsam genutzt .
quelle
Ein Feld kann entweder der Klasse oder einer Instanz einer Klasse zugewiesen werden. Standardmäßig sind Felder Instanzvariablen. Durch die Verwendung
static
des Feldes wird eine Klassenvariable, daher gibt es nur eineclock
. Wenn Sie Änderungen an einer Stelle vornehmen, ist diese überall sichtbar. Instanzvariablen werden unabhängig voneinander geändert.quelle
Das Schlüsselwort
static
wird verwendet, um ein Feld oder eine Methode als zur Klasse selbst und nicht zur Instanz gehörend zu bezeichnen. Wenn das Objekt unter Verwendung Ihres CodesClock
statisch ist,Hello
teilen alle Instanzen der Klasse diesesClock
Datenelement (Feld) gemeinsam. Wenn Sie es nicht statisch machen, kann jede einzelne Instanz vonHello
ein eindeutigesClock
Feld haben.Das Problem ist, dass Sie Ihrer Klasse eine Hauptmethode hinzugefügt haben
Hello
, damit Sie den Code ausführen können. Das Problem hierbei ist, dass die Hauptmethode statisch ist und sich daher nicht auf nicht statische Felder oder darin enthaltene Methoden beziehen kann. Sie können dies auf zwei Arten lösen:Hello
Klasse statisch, damit auf sie im Hauptverzeichnis verwiesen werden kann werden kann. Dies ist wirklich keine gute Sache (oder der falsche Grund, ein Feld und / oder eine Methode statisch zu machen)Hello
Klasse in der Hauptmethode und greifen Sie auf alle Felder und Methoden so zu, wie sie ursprünglich vorgesehen waren.Für Sie bedeutet dies die folgende Änderung Ihres Codes:
quelle
In Java kann das
static
Schlüsselwort einfach als Hinweis auf Folgendes angesehen werden:Wenn Sie so denken
static
, wird es einfacher, seine Verwendung in den verschiedenen Kontexten zu verstehen, in denen es anzutreffen ist:Ein
static
Feld ist ein Feld, das eher zur Klasse als zu einer bestimmten Instanz gehörtEine
static
Methode ist eine Methode, von der keine Ahnung hatthis
; Es ist in der Klasse definiert und kennt keine bestimmte Instanz dieser Klasse, es sei denn, eine Referenz wird an sie übergebenEine
static
Mitgliedsklasse ist eine verschachtelte Klasse ohne Vorstellung oder Kenntnis einer Instanz ihrer umschließenden Klasse (es sei denn, ihr wird ein Verweis auf eine umschließende Klasseninstanz übergeben).quelle
Static macht das Clock-Mitglied zu einem Klassenmitglied anstelle eines Instanzmitglieds. Ohne das statische Schlüsselwort müssten Sie eine Instanz der Hello-Klasse erstellen (die eine Clock-Member-Variable hat) - z
quelle
Statische Methoden verwenden keine Instanzvariablen der Klasse, in der sie definiert sind. Eine sehr gute Erklärung des Unterschieds finden Sie auf dieser Seite
quelle
Ich habe eine Vorliebe für statische Methoden (nur wenn möglich) in "Helfer" -Klassen entwickelt.
Die aufrufende Klasse muss keine weitere Mitgliedsvariable (Instanzvariable) der Hilfsklasse erstellen. Sie rufen einfach die Methoden der Hilfsklasse auf. Außerdem wird die Hilfsklasse verbessert, da Sie keinen Konstruktor mehr benötigen und keine Mitgliedsvariablen (Instanzvariablen) benötigen.
Es gibt wahrscheinlich andere Vorteile.
quelle
quelle
Kann auch an statische Mitglieder denken, die keinen "this" -Zeiger haben. Sie werden von allen Instanzen gemeinsam genutzt.
quelle
Statische Konzepte verstehen
Zweite Klasse
quelle
main()
ist eine statische Methode, die zwei grundlegende Einschränkungen aufweist:this()
undsuper()
kann nicht im statischen Kontext verwendet werden.quelle
Auf statische Variablen kann nur mit statischen Methoden zugegriffen werden. Wenn wir also die statischen Variablen deklarieren, sind diese Getter- und Setter-Methoden statische Methoden
Statische Methoden sind eine Klassenebene, auf die wir über den Klassennamen zugreifen können
Das Folgende ist ein Beispiel für statische Variablen Getter und Setter:
quelle
Eine Frage wurde gefragt , hier über die Wahl des Wortes ‚statisch‘ für dieses Konzept. Es wurde auf diese Frage getäuscht, aber ich glaube nicht, dass die Etymologie klar angesprochen wurde. Damit...
Dies liegt an der Wiederverwendung von Schlüsselwörtern, beginnend mit C.
Betrachten Sie Datendeklarationen in C (innerhalb eines Funktionskörpers):
Die Variable foo wird beim Eingeben der Funktion auf dem Stapel erstellt (und beim Beenden der Funktion zerstört). Im Gegensatz dazu ist die Bar immer vorhanden, daher ist sie im Sinne des üblichen Englisch "statisch" - sie führt nirgendwo hin.
Java und ähnliche Sprachen haben dasselbe Konzept für Daten. Daten können entweder pro Instanz der Klasse (pro Objekt) oder einmal für die gesamte Klasse zugewiesen werden. Da Java eine vertraute Syntax für C / C ++ - Programmierer anstrebt, ist hier das Schlüsselwort 'static' angemessen.
Zuletzt kommen wir zu Methoden.
Konzeptionell gibt es für jede Instanz der Klasse C eine Instanz von foo (). Es gibt nur eine Instanz von bar () für die gesamte Klasse C. Dies ist parallel zu dem Fall, den wir für Daten besprochen haben, und verwendet daher 'static' 'ist wieder eine vernünftige Wahl, insbesondere wenn Sie Ihrer Sprache keine reservierteren Schlüsselwörter hinzufügen möchten.
quelle