Fix: Nicht statische Methode Kann nicht aus einem statischen Kontext referenziert werden

Viele Programmierer sehen beim Codieren die Fehlermeldung " Nicht statische Methode kann nicht aus einem statischen Kontext referenziert werden". Diese Fehlermeldung ist nicht spezifisch und kann in jeder IDE auftreten, wenn die Bedingungen für den Fehler erfüllt sind.

Dies ist ein sehr häufiger Fehler für Anfänger, bei denen der Programmierer versucht, eine Klasse "statisch" zu verwenden, ohne eine Instanz der Klasse zu erstellen. Es gibt mehrere Bedingungen, die erfüllt sein müssen, wenn Sie eine statische Klasse verwenden. In diesem Artikel werden wir verschiedene Fälle durchgehen und Ihnen zeigen, wie Sie eine statische Klasse verwenden.

Was ist eine statische Methode?

Durch Hinzufügen des Schlüsselworts 'static' zu einer Methode wird die Methode als statische Methode bezeichnet. Eine statische Methode gehört eher zur Klasse als zu einem Objekt (was die Norm ist). Eine statische Methode kann einfach aufgerufen werden, ohne dass eine Instanz einer Klasse erstellt werden muss.

Es gibt verschiedene Verwendungsmöglichkeiten für statische Methoden. Mit dieser Methode können Sie beispielsweise ein statisches Datenelement und seinen Wert ändern. Bei Verwendung einer statischen Methode gibt es jedoch noch einige Einschränkungen. Wenn Sie beispielsweise auf nicht statische Felder Ihrer Klasse zugreifen möchten, müssen Sie eine nicht statische Methode verwenden. Zusammenfassend lässt sich sagen, dass statische Methoden sehr sparsam eingesetzt werden, aber sie haben ihre Vorteile.

Hier ist ein kurzes Beispiel dafür, wie eine statische Methode erstellt werden kann, um die Eigenschaft aller Objekte zu ändern.

Klasse Schüler {int roll_no; String name; statischer String college = "InformationTech"; statische void change () {college = "Management";} Studenten (int number, String name_self) {roll_no = number; name = name_self;} void display () {System.out.println (rollno + "" + name + "" + College);} public static void main (String args []) {Students.change (); Studenten stu_1 = neue Studenten (100, "Mexikaner"); Studenten stu_2 = neue Studenten (202, "Amerikaner"); Studenten stu_3 = neue Schüler (309, "britisch"); stu_1.display (); stu_2.display (); stu_3.display ();}}

Die Ausgabe des Programms lautet:

100 Mexikanisches Management 202 Amerikanisches Management 309 Britisches Management

Was ist der Unterschied zwischen einer Klasse und einer Instanz einer Klasse?

Denken Sie, Sie gehen auf der Straße und sehen ein Auto. Jetzt wissen Sie sofort, dass dies ein Auto ist, auch wenn Sie nicht wissen, welches Modell oder welcher Typ es ist. Dies liegt daran, dass Sie wissen, dass dies zu der Klasse von "Autos" gehört, die Sie bereits kennen. Stellen Sie sich den Unterricht hier als Vorlage oder Idee vor.

Wenn Sie näher kommen, sehen Sie das Modell und die Marke des Autos. Hier erkennen Sie die 'Instanz' der Klasse 'Auto'. Hier werden alle Eigenschaften im Detail vorhanden sein; die Räder, die Leistung, die Felgen usw.

Ein Beispiel für Eigenschaften kann sein, dass die Klasse "Auto" angibt, dass alle Autos Räder haben sollten. Das Auto, das Sie sehen (ein Beispiel der Fahrzeugklasse), hat Leichtmetallfelgen.

In der objektorientierten Programmierung definieren Sie die Klasse selbst und innerhalb der Klasse ein Feld vom Typ 'Farbe'. Immer wenn die Klasse instanziiert wird, wird der Speicher automatisch für die Farbe im Backend reserviert. Später können Sie diesem einen bestimmten Wert zuweisen (z. B. Rot). Da solche Attribute spezifisch sind, sind sie nicht statisch.

Im Gegensatz dazu werden statische Methoden und Felder mit allen Instanzen gemeinsam genutzt. Diese werden für Werte oder Elemente erstellt, die für die Klasse und nicht für die Instanz selbst spezifisch sind. Für Methoden kann es globale Methoden geben (z. B. stringtoInt-Konverter), und für Felder sind sie normalerweise Konstanten gemäß Ihrem Code (z. B. kann der Fahrzeugtyp statisch sein, wenn Sie nur normale Fahrzeuge herstellen).

Jetzt werden wir uns die verschiedenen Fälle ansehen, in denen Ihre Codierung schief gehen kann, und die Problemumgehungen sehen, um sie zu beheben.

Problem 1: Sie rufen etwas auf, das nicht existiert

Wir sind auf einige Fälle gestoßen, in denen Benutzer sowohl statische als auch nicht statische Methoden miteinander verwendeten. Wenn wir dies tun, sollten Sie darauf achten, welche Methode was aufruft (statisch oder nicht). Sehen Sie sich den folgenden Code an:

private java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Die folgende Anweisung verursacht den Fehler. Sie wissen warum .. java.util.List someList = someMethod (); }}

Hier ruft die statische Methode someMethod auf. Bei der objektorientierten Programmierung kapseln wir die Daten zusammen mit den Daten, mit denen wir arbeiten möchten. Hier gibt es ohne Objekt keine Instanzdaten, und während die Instanzmethoden als Teil der Klassendefinition vorhanden sind, sollte immer eine Objektinstanz vorhanden sein, um ihnen Daten bereitzustellen.

Zusammenfassend kann man also nichts nennen, was nicht existiert. Da Sie möglicherweise kein Objekt erstellt haben, ist die nicht statische Methode noch nicht vorhanden. Andererseits wird es immer eine statische Methode geben (aufgrund der Definition).

Problem 2: Methoden werden nicht statisch gemacht

Wenn Sie Methoden von Ihrer statischen Hauptmethode aus aufrufen, ohne eine Instanz der Methoden zu erstellen, wird eine Fehlermeldung angezeigt. Hier gilt das gleiche Prinzip; Sie können nicht auf etwas zugreifen, das nicht existiert.

öffentliche Klasse BookStoreApp2 {// Konstanten für Optionen Scannereingabe = neuer Scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // Array deklarieren item = new BookStoreItem [10]; // Array initialisieren int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // Ende der switch-Anweisung} // Ende der for-Schleife für (int i = 0; i <item.length; i ++) {} // end of for} // Ende der Hauptmethode

Hier in diesem Code müssen Sie beide Methoden printMenu () und getUserChoice () in statische Methoden konvertieren .

Wenn Sie eine solche Situation umgehen möchten, können Sie stattdessen einen Konstruktor verwenden. Sie können beispielsweise den Inhalt Ihrer main () -Methode in einen Konstruktor einfügen.

public BookStoreApp2 () {// Inhalt der Hauptmethode hier einfügen} Führen Sie anschließend in Ihrer main () -Methode die folgenden Schritte aus: public void main (String [] args) {new BookStoreApp2 (); }}

Wenn diese Tipps bei Ihrem oder Ihrem Code nicht funktionieren, sollten Sie die Grundprinzipien der statischen Klassen und Methoden berücksichtigen und Ihren Code erneut überprüfen, um sicherzustellen, dass das Grundprinzip nicht verletzt wird.