Ich habe diesen Testcode geschrieben:
class MyProgram
{
int count = 0;
public static void main(String[] args)
{
System.out.println(count);
}
}
Aber es gibt den folgenden Fehler:
Main.java:6: error: non-static variable count cannot be referenced from a static context
System.out.println(count);
^
Wie erhalte ich meine Methoden zum Erkennen meiner Klassenvariablen?
C
. Aber es wird nicht sehr gut. Versuchen Sie, Java so zu verwenden, wie es verwendet werden soll, als objektorientierte Sprache.Antworten:
Sie müssen den Unterschied zwischen einer Klasse und einer Instanz dieser Klasse verstehen. Wenn Sie ein Auto auf der Straße sehen, wissen Sie sofort, dass es sich um ein Auto handelt, auch wenn Sie nicht sehen können, welches Modell oder welcher Typ. Dies liegt daran, dass Sie das, was Sie sehen, mit der Klasse "Auto" vergleichen. Die Klasse enthält, die allen Autos ähnlich ist. Betrachten Sie es als Vorlage oder Idee.
Gleichzeitig ist das Auto, das Sie sehen, eine Instanz der Klasse "Auto", da es alle Eigenschaften hat, die Sie erwarten: Es fährt jemand, es hat einen Motor, Räder.
Die Klasse sagt also "alle Autos haben eine Farbe" und die Instanz sagt "dieses spezielle Auto ist rot".
In der OO-Welt definieren Sie die Klasse und innerhalb der Klasse definieren Sie ein Typfeld
Color
. Wenn die Klasse instanziiert wird (wenn Sie eine bestimmte Instanz erstellen), ist der Speicher für die Farbe reserviert, und Sie können dieser bestimmten Instanz eine Farbe geben. Da diese Attribute spezifisch sind, sind sie nicht statisch.Statische Felder und Methoden werden von allen Instanzen gemeinsam genutzt. Sie gelten für klassenspezifische Werte und nicht für eine bestimmte Instanz. Bei Methoden sind dies normalerweise globale Hilfsmethoden (wie
Integer.parseInt()
). Für Felder sind es normalerweise Konstanten (wie Autotypen, dh etwas, bei dem Sie eine begrenzte Menge haben, die sich nicht oft ändert).Um Ihr Problem zu lösen, müssen Sie eine Instanz Ihrer Klasse instanziieren (ein Objekt erstellen), damit die Laufzeit Speicher für die Instanz reservieren kann (andernfalls würden sich verschiedene Instanzen gegenseitig überschreiben, was Sie nicht möchten).
Versuchen Sie in Ihrem Fall diesen Code als Startblock:
Die neue
main()
Methode erstellt eine Instanz der Klasse, die sie enthält (klingt seltsam, aber damain()
sie mit der Klasse anstatt mit der Instanz erstellt wird, kann sie dies tun) und ruft dann eine Instanzmethode (run()
) auf.quelle
Statische Felder und Methoden sind mit der Klasse selbst und nicht mit ihren Instanzen verbunden. Wenn Sie eine Klasse
A
, eine 'normale' Methodeb
und eine statische Methodec
haben und eine Instanza
Ihrer Klasse erstellenA
, sind die Aufrufe vonA.c()
unda.b()
gültig. Die Methodec()
hat keine Ahnung, welche Instanz verbunden ist, daher kann sie keine nicht statischen Felder verwenden.Die Lösung für Sie besteht darin, dass Sie entweder Ihre Felder statisch oder Ihre Methoden nicht statisch machen. Sie könnten dann hauptsächlich so aussehen:
quelle
Das
static
Schlüsselwort ändert den Lebenszyklus einer Methode oder Variablen innerhalb einer Klasse. Einestatic
Methode oder Variable wird zum Zeitpunkt des Ladens einer Klasse erstellt. Eine Methode oder Variable, die nicht als deklariertstatic
ist, wird nur erstellt, wenn die Klasse beispielsweise mithilfe desnew
Operators als Objekt instanziiert wird .Der Lebenszyklus einer Klasse ist im Großen und Ganzen:
new
Operator , indem Sie die Klasse verwenden, um eine Instanz der Klasse als tatsächliches Objekt zu und dann, wenn Sie mit dem Objekt fertig sindUm einen ersten Einstiegspunkt für eine Anwendung zu haben, hat Java die Konvention übernommen, dass das Java-Programm eine Klasse haben muss, die eine Methode mit einem vereinbarten oder speziellen Namen enthält. Diese spezielle Methode wird aufgerufen
main()
. Da die Methode existieren muss, unabhängig davon, ob die Klasse, die die Hauptmethode enthält, instanziiert wurde oder nicht,main()
muss die Methode mit demstatic
Modifikator deklariert werden , damit diemain()
Methode verfügbar ist, sobald die Klasse geladen wird.Das Ergebnis ist, dass beim Starten Ihrer Java-Anwendung über eine Befehlszeile beispielsweise
java helloworld
eine Reihe von Aktionen ausgeführt werden. Zunächst wird eine Java Virtual Machine gestartet und initialisiert. Als nächstes wird die Datei helloworld.class, die den kompilierten Java-Code enthält, in die Java Virtual Machine geladen. Anschließend sucht die Java Virtual Machine in derhelloworld
aufgerufenen Klasse nach einer Methodemain(String [] args)
. Diese Methode mussstatic
so sein, dass sie existiert, obwohl die Klasse nicht tatsächlich als Objekt instanziiert wurde. Die Java Virtual Machine erstellt keine Instanz der Klasse, indem sie ein Objekt aus der Klasse erstellt. Es lädt nur die Klasse und startet die Ausführung bei dermain()
Methode.Sie müssen also eine Instanz Ihrer Klasse als Objekt erstellen und können dann auf die Methoden und Variablen der Klasse zugreifen, die nicht mit dem
static
Modifikator deklariert wurden . Sobald Ihr Java-Programm mit dermain()
Funktion gestartet wurde, können Sie alle Variablen oder Methoden verwenden, die den Modifikator habenstatic
da sie als Teil der zu ladenden Klasse vorhanden sind.Die Variablen und Methoden der Klasse, die sich außerhalb der
main()
Methode befinden und nicht über denstatic
Modifikator verfügen, können jedoch erst verwendet werden, wenn eine Instanz der Klasse als Objekt innerhalb dermain()
Methode erstellt wurde. Nach dem Erstellen des Objekts können Sie die Variablen und Methoden des Objekts verwenden. Ein Versuch, die Variablen und Methoden der Klasse zu verwenden, die denstatic
Modifikator nicht haben, ohne ein Objekt der Klasse zu durchlaufen, wird vom Java-Compiler zur Kompilierungszeit abgefangen und als Fehler gekennzeichnet.quelle
Lassen Sie uns zuerst Ihr Programm analysieren. In Ihrem Programm ist Ihre erste Methode
main()
, und denken Sie daran, dass es sich um die statische Methode handelt. Dann deklarieren Sie die lokale Variable für diese Methode (compareCount, low, high usw.). Der Bereich dieser Variablen ist nur die deklarierte Methode, unabhängig davon, ob es sich um eine statische oder eine nicht statische Methode handelt. Sie können diese Variablen also nicht außerhalb dieser Methode verwenden. Dies ist der grundlegende Fehler, den du gemacht hast.Dann kommen wir zum nächsten Punkt. Du hast gesagt, statisch bringt dich um. (Es mag dich töten, aber es gibt deinem Programm nur Leben !!) Zuerst musst du die grundlegende Sache verstehen. * Die statische Methode ruft nur die statische Methode auf und verwendet nur die statische Variable. * Statische Variablen oder statische Methoden sind von keiner Instanz dieser Klasse abhängig. (dh wenn Sie einen Status der statischen Variablen ändern, wird dieser in allen Objekten der Klasse wiedergegeben.) * Aus diesem Grund rufen Sie ihn als Klassenvariable oder Klassenmethode auf. Und es gibt noch viel mehr über das Schlüsselwort "statisch". Ich hoffe jetzt kommst du auf die Idee. Ändern Sie zuerst den Bereich der Variablen und deklarieren Sie sie als statisch (um sie in statischen Methoden verwenden zu können).
Und der Rat für Sie lautet: Sie haben die Idee des Umfangs der Variablen und statischen Funktionen falsch verstanden. Machen Sie sich eine klare Vorstellung davon.
quelle
Das Grundlegende ist, dass statische Variablen oder statische Methoden auf Klassenebene sind. Variablen oder Methoden auf Klassenebene werden vor Methoden oder Variablen auf Instanzebene geladen. Und natürlich kann das, was nicht geladen ist, nicht verwendet werden. Der Java-Compiler, der nicht zulässt, dass die zur Laufzeit zu behandelnden Dinge zur Kompilierungszeit aufgelöst werden. Das ist der Grund, warum es Ihnen Fehler gibt. Nicht statische Dinge können nicht aus dem statischen Kontext referenziert werden. Sie müssen nur Informationen zum Klassenbereich, zum Instanzbereich und zum lokalen Bereich lesen.
quelle
Um von Ihren statischen Methoden aus auf sie zugreifen zu können, müssen sie statische Elementvariablen sein, wie folgt:
quelle
Jetzt können Sie Instanzen mit in der Methode hinzufügen / verwenden
quelle
Ich werde versuchen, Ihnen die statische Sache zu erklären. Erstens gehören statische Variablen nicht zu einer bestimmten Instanz der Klasse. Sie werden mit dem Namen der Klasse erkannt. Statische Methoden gehören wiederum nicht wieder zu einer bestimmten Instanz. Sie können nur auf statische Variablen zugreifen. Stellen Sie sich vor, Sie rufen MyClass.myMethod () auf und myMethod ist eine statische Methode. Wenn Sie nicht statische Variablen innerhalb der Methode verwenden, wie zum Teufel würde es dann wissen, welche Variablen verwendet werden sollen? Aus diesem Grund können Sie mit statischen Methoden nur statische Variablen verwenden. Ich wiederhole noch einmal, sie gehören NICHT zu einer bestimmten Instanz.
quelle
Das erste ist, den Unterschied zwischen einer Instanz einer Klasse und der Klasse selbst zu kennen. Eine Klasse modelliert bestimmte Eigenschaften und das Verhalten des Ganzen im Kontext dieser Eigenschaften. Eine Instanz definiert bestimmte Werte für diese Eigenschaften.
Alles, was an das statische Schlüsselwort gebunden ist, ist im Kontext der Klasse und nicht im Kontext einer Instanz der Klasse verfügbar
Als Folge des oben Gesagten
Die Lebensdauer eines statischen Felds / einer statischen Methode entspricht der Lebensdauer Ihrer Anwendung
ZB sagen wir, Auto hat die Eigenschaftsfarbe und zeigt das Verhalten 'Bewegung'. Ein Beispiel für das Auto wäre ein roter Volkswagen Käfer, der mit 25 km / h in Bewegung ist.
Eine statische Eigenschaft des Autos wäre nun die Anzahl der Räder (4) auf der Straße, und dies würde für alle Autos gelten.
HTH
quelle
Es ist ClassLoader verantwortlich, die Klassendateien zu laden. Mal sehen, was passiert, wenn wir unsere eigenen Klassen schreiben.
Beispiel 1:
Jetzt können wir sehen, dass die Klasse "StaticTest" 3 Felder hat. Aber tatsächlich gibt es keine Existenz der Mitgliedsvariablen b, c. Aber warum ???. OK, damit wir nicht sehen. Hier sind b, c Instanzvariablen. Da die Instanzvariable den Speicher zum Zeitpunkt der Objekterstellung erhält. Also hier bekommen b, c noch keinen Speicher. Deshalb gibt es keine Existenz von b, c. Es gibt also nur eine Existenz von a. Für ClassLoader gibt es nur eine Information über a. ClassLoader erkennt b, c noch nicht, da das Objekt noch nicht instanziiert ist.
Sehen wir uns ein anderes Beispiel an: Beispiel 2:
Wenn wir nun versuchen, diesen Code zu kompilieren, gibt der Compiler einen CE-Fehler aus. CE: Nicht statische Methoden display () können nicht aus einem statischen Kontext referenziert werden.
Für ClassLoader sieht es nun so aus:
In Beispiel 2 liegt der CE-Fehler darin, dass wir eine nicht statische Methode aus einem statischen Kontext aufrufen. Daher ist es ClassLoader nicht möglich, die Methode display () zur Kompilierungszeit zu erkennen. Daher ist ein Fehler bei der Kompilierung aufgetreten.
quelle
Bevor Sie eine Instanzmethode oder Instanzvariable aufrufen, benötigt sie ein Objekt (Instanz). Wenn die Instanzvariable vom statischen Methodencompiler aufgerufen wird, weiß sie nicht, zu welchem Objekt diese Variable gehört. Weil statische Methoden kein Objekt haben (immer nur eine Kopie). Wenn Sie eine Instanzvariable oder Instanzmethoden von der Instanzmethode aus aufrufen, verweisen Sie auf die
this
Objekt. Dies bedeutet, dass die Variable zu jedem erstellten Objekt gehört und jedes Objekt eine eigene Kopie der Instanzmethoden und -variablen hat.Statische Variablen sind als gekennzeichnet
static
und Instanzvariablen haben kein bestimmtes Schlüsselwort.quelle
Dies ist etwas schwierig, um das statische Schlüsselwort für alle Anfänger zu erklären.
Sie werden es klar kennenlernen, wenn Sie mehr mit Klassen und Objekten arbeiten.
| * | Statisch: Statische Elemente können mit Klassennamen aufgerufen werden.
Wenn Sie in Codes beobachten, werden einige Funktionen direkt mit Klassennamen wie aufgerufen
Dies liegt daran, dass NamFnc und println mit dem vor ihnen stehenden Schlüsselwort static deklariert werden.
| * | Nicht statisch: Nicht statische Elemente können mit der Klassenvariablen aufgerufen werden.
Wenn sie nicht statisch ist, benötigen Sie eine Variable der Klasse,
setzen einen Punkt nach der Klassenvariablen und
rufen dann die Funktion auf.
Der folgende Code erklärt Sie ordentlich
| * | Statische und nicht statische Funktion in der Klasse:
| * | Statische und nicht statische Klasse innerhalb einer Klasse:
quelle