Fix: Icke statisk metod kan inte hänvisas från ett statiskt sammanhang
Många programmerare står inför felmeddelandet ”Icke statisk metod kan inte hänvisas från ett statiskt sammanhang”När de kodar. Det här felmeddelandet är inte specifikt och kan förekomma i alla IDE om villkoren för felet är sanna.
Detta är ett mycket vanligt misstag för nybörjare där programmeraren försöker använda en klass 'statiskt' utan att göra en instans av klassen. Det finns flera villkor som måste uppfyllas när du använder en klass som är statisk. I den här artikeln kommer vi att gå igenom flera olika fall och vägleda dig om hur du använder en statisk klass.
Vad är en statisk metod?
Att lägga till nyckelordet "statisk" till vilken metod som helst gör metoden känd som en statisk metod. En statisk metod tillhör klassen snarare än att tillhöra ett objekt (vilket är normen). En statisk metod kan enkelt åberopas utan villkoret för att skapa en instans av en klass.
Det finns flera olika användningsområden för statiska metoder, till exempel genom att använda den kan du ändra en statisk datamedlem och dess värde. Det finns dock fortfarande vissa begränsningar när man använder en statisk metod. Om du till exempel vill komma åt icke-statiska fält i din klass måste du använda en icke-statisk metod. För att sammanfatta, används statiska metoder väldigt sparsamt men de har sina fördelar.
Här är ett kort exempel på hur en statisk metod kan göras för att ändra egenskapen för alla objekt.
klasselever {int roll_no; Strängnamn; static String college = "InformationTech"; statisk tomrumsförändring () {college = “Management”;} Studenter (int-nummer, 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 = new Students (100, "Mexican"); Students stu_2 = new Students (202, "American"); Students stu_3 = nya studenter (309, "brittiska"); stu_1.display (); stu_2.display (); stu_3.display ();}}
Programmets resultat kommer att vara:
100 mexikansk ledning 202 amerikansk ledning 309 brittisk ledning
Vad är skillnaden mellan en klass och instans av en klass?
Tror att du går på gatan och ser en bil. Nu vet du omedelbart att det här är en bil även om du inte vet vad som är modell eller typ. Detta beror på att du vet att detta tillhör den klass av "bilar" som du redan känner till. Tänk på klassen här som en mall eller en idé.
Nu när du närmar dig ser du modell och modell av bilen. Här känner du igen "instansen" av klassen "bil". Här kommer alla fastigheter att finnas i detalj; hjulen, hästkrafterna, fälgarna etc.
Ett exempel på egenskaper kan vara att klassen ”bil” anger att alla bilar ska ha hjul. Bilen som du ser (en förekomst av bilklassen) har legeringsfälgar.
I objektorienterad programmering definierar du klassen själv och inom klassen definierar du ett fält av typen ”färg”. När klassen instanseras reserveras minnet automatiskt för färgen i backend och senare kan du ge detta ett specifikt värde (till exempel rött). Eftersom attribut som dessa är specifika är de icke-statiska.
Däremot delas statiska metoder och fält med alla instanser. Dessa är gjorda för värde eller föremål som är specifika för klassen och inte själva förekomsten. För metoder kan det finnas globala metoder (till exempel stringtoInt converter) och för fält är de vanligtvis konstanter enligt din kod (till exempel kan biltypen vara statisk om du bara tillverkar vanliga bilar).
Nu kommer vi att titta på alla olika fall där din kodning kan gå fel och se lösningarna för att fixa dem.
Utgåva 1: Du ringer till något som inte finns
Vi stötte på några fall där användare använde både statiska och icke-statiska metoder med varandra. När vi gör detta bör du vara försiktig med vilken metod som kallar vad (i form av statisk eller inte). Ta en titt på följande kod:
privat java.util.ListsomeMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Följande uttalande orsakar felet. Du vet varför .. java.util.List someList = someMethod (); }
Här kallar den statiska metoden someMethod. I objektorienterad programmering inkapslar vi data tillsammans med de data som vi vill använda. Här, utan ett objekt, finns det ingen förekomstdata och medan förekomstmetoderna finns som en del av klassdefinitionen bör det alltid finnas en objektinstans för att tillhandahålla data till dem.
Så för att sammanfatta kan du inte ringa något som inte finns. Eftersom du kanske inte har skapat ett objekt finns den icke-statiska metoden ännu inte. Å andra sidan kommer dock en statisk metod alltid att finnas (på grund av definition).
Utgåva 2: Metoder görs inte statiska
Om du åberopar metoder från din statiska huvudmetod utan att skapa en instans av metoderna får du ett felmeddelande. Här gäller samma princip; du kan inte komma åt något som inte finns.
public class BookStoreApp2 {// konstanter för alternativ Skannerinmatning = ny skanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // declaring array item = new BookStoreItem [10]; // initializing array int itemType = -1; printMenu (); getUserChoice (); för (int i = 0; iHär i den här koden måste du konvertera båda metoderna printMenu () och getUserChoice () till statiska metoder.
Därför kan du använda en om du vill komma runt en sådan situation konstruktör istället. Du kan till exempel ta innehållet i din huvudmetod () och placera dem i en konstruktör.
public BookStoreApp2 () {// Lägg innehållet i huvudmetoden här} När du har gjort detta gör du följande i din main () -metod: public void main (String [] args) {new BookStoreApp2 (); }Om dessa tips inte fungerar på din eller din kod är annorlunda, bör du komma ihåg de grundläggande principerna för statiska klasser och metoder och kontrollera din kod igen för att se till att grundprincipen inte bryts.