Fix: Icke-statisk metod Kan inte refereras från ett statiskt sammanhang

Många programmerare möter felmeddelandet " Icke-statisk metod kan inte refereras från ett statiskt sammanhang " när de kodar. Det här felmeddelandet är inte specifikt och kan förekomma i valfri IDE om villkoren för felet är sanna.

Icke-statisk metod kan inte hänvisas från ett statiskt sammanhang

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 alla metoder 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 lätt åberopas utan villkoret att skapa en instans av en klass.

Det finns flera olika användningar av statiska metoder, till exempel kan du ändra en statisk datamedlem och dess värde genom att använda den. Det finns dock fortfarande vissa begränsningar när du 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. Så sammanfattningsvis används statiska metoder mycket 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.

 klassstudenter {int roll_no; Strängnamn; statisk String college = "InformationTech"; static void Change () {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 (); Studenter stu_1 = nya studenter (100, "mexikansk"); Studenter stu_2 = new Students (202, "American"); Studenter stu_3 = nya studenter (309, "brittiska"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Programmet kommer att vara:

 100 mexikansk management 202 amerikansk ledning 309 brittisk ledning 

Vad är skillnaden mellan en klass och instans för 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. Det beror på att du vet att detta tillhör klassen "bilar" som du redan känner till. Tänk på klass här som en mall eller en idé.

När du närmar dig närmare ser du modellen och märket på bilen. Här känner du igen "instansen" av klassens "bil". Här kommer alla egenskaper att finnas i detalj; hjulen, hästkraften, fälgen etc.

Ett exempel på egenskaper kan vara att klassen "bil" anger att alla bilar ska ha hjul. Bilen som du ser (ett exempel på bilklass) har legeringsfälgar.

I objektorienterad programmering definierar du klassen själv och inuti klassen definierar du ett fält av typen 'färg'. Varje gång klassen instanseras, är minnet automatiskt reserverat 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 instansen. För metoder kan det finnas globala metoder (till exempel stringtoInt-omvandlare) 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 ska vi titta på alla olika fall där din kodning kan gå fel och se lösningarna för att fixa dem.

Problem 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). Titta på följande kod:

 privat java.util.Lista someMethod () {/ * 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 ringer den statiska metoden someMethod. Vid objektorienterad programmering kapslar vi in ​​data tillsammans med de data som vi vill arbeta med. Här, utan ett objekt, finns det ingen instansdata och medan instansmetoderna 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 en statisk metod alltid att finnas (på grund av definitionen).

Utgåva 2: Metoderna 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 Scannerinmatning = 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; i <item.length; i ++) {} // end of switch statement} // end of for loop for (int i = 0; i <item.length; i ++) {} // end av för} // slutet av huvudmetoden 

Här i den här koden måste du konvertera både metoden printMenu () och getUserChoice () till statiska metoder.

Därför om du vill komma runt en situation som denna kan du istället använda en konstruktör . Till exempel kan du ta innehållet i din huvudmetod () och placera dem i en konstruktör.

 public BookStoreApp2 () {// Lägg innehållet i huvudmetoden här} Gör följande i din huvudmetod (): public void main (String [] args) {new BookStoreApp2 (); } 

Om dessa tips inte fungerar på din eller din kod är annorlunda, bör du tänka på de grundläggande principerna för statiska klasser och metoder och kontrollera din kod igen för att se till att grundprincipen inte bryts.

Intressanta Artiklar