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

Bei vielen Programmierern tritt die Fehlermeldung " Nicht statische Methode kann nicht aus einem statischen Kontext referenziert werden " auf, wenn sie codieren. Diese Fehlermeldung ist nicht spezifisch und kann in jeder IDE auftreten, wenn die Bedingungen für den Fehler zutreffen.

Nicht statische Methode kann nicht aus einem statischen Kontext referenziert werden

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 problemlos aufgerufen werden, ohne dass eine Instanz einer Klasse erstellt werden muss.

Statische Methoden werden auf verschiedene Arten verwendet. Mit ihr können Sie beispielsweise ein statisches Datenelement und seinen Wert ändern. Bei der Verwendung einer statischen Methode bestehen 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 nur sehr sparsam eingesetzt werden, aber ihre Vorteile haben.

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

 Klasse Studenten {int roll_no; String name; static String college = "InformationTech"; static void change () {college = "Management";} Students (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 (); Students stu_1 = neue Students (100, "Mexican"); Students stu_2 = neue Students (202, "American"); Students stu_3 = neue Schüler (309, "britisch"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Die Ausgabe des Programms ist:

 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 Sie 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 der "Autos" gehört, die Sie bereits kennen. Stellen Sie sich den Unterricht hier als Vorlage oder Idee vor.

Wenn Sie näher heranrücken, 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 (eine Instanz der Autoklasse), 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 automatisch Speicher für die Farbe im Backend reserviert und später können Sie diesem einen bestimmten Wert zuweisen (zum Beispiel Rot). Da Attribute wie diese spezifisch sind, sind sie nicht statisch.

Im Gegensatz dazu werden statische Methoden und Felder für alle Instanzen freigegeben. Diese sind für Werte oder Elemente vorgesehen, die für die Klasse und nicht für die Instanz selbst spezifisch sind. Für Methoden gibt es globale Methoden (z. B. stringtoInt converter) 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 fehlerhaft sein kann, und die Problemumgehungen anzeigen, um sie zu beheben.

Problem 1: Sie rufen etwas an, das nicht existiert

In einigen Fällen verwendeten Benutzer statische und nicht statische Methoden. 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 es immer eine Objektinstanz geben, die ihnen Daten bereitstellt.

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. Auf der anderen Seite gibt es jedoch immer eine statische Methode (aufgrund der Definition).

Problem 2: Methoden werden nicht statisch gemacht

Wenn Sie Methoden von Ihrer Static-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.

 public class BookStoreApp2 {// Konstanten für Optionen Scanner input = new 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 for (int i = 0; i <item.length; i ++) {} // Ende of for} // Ende der Hauptmethode 

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

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

 public BookStoreApp2 () {// Inhalt der main-Methode 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 nicht auf Ihren Code zutreffen oder Ihr Code anders ist, 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.

Interessante Artikel