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

Viele Programmierer sehen sich mit der Fehlermeldung „Nicht statische Methoden können nicht aus einem statischen Kontext referenziert werden’, Wenn sie codieren. 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 "statisch" 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 zum Ändern der Eigenschaft aller Objekte erstellt werden kann.

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, "mexikanisch"); Studenten stu_2 = neue Studenten (202, "amerikanisch"); 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 es sich um ein Auto handelt, 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 definieren Sie 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 geben (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 finden, um sie zu beheben.

Problem 1: Sie rufen etwas an, das nicht vorhanden ist

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 vorsichtig sein, welche Methode was aufruft (in Bezug auf 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 aufrufen, was nicht existiert. Da Sie möglicherweise kein Objekt erstellt haben, ist die nicht statische Methode noch nicht vorhanden. Andererseits wird es jedoch 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 vorhanden ist.

ö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 

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

Wenn Sie also eine Situation wie diese umgehen möchten, können Sie a verwenden Konstrukteur stattdessen. 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.

Facebook Twitter Google Plus Pinterest