Vejledninger

Fix: Ikke-statisk metode kan ikke henvises til fra en statisk kontekst

Mange programmører står over for fejlmeddelelsen 'Ikke-statisk metode kan ikke henvises til fra en statisk kontekst'Når de koder. Denne fejlmeddelelse er ikke specifik og kan forekomme i enhver IDE, hvis betingelserne for fejlen er sande.

Dette er en meget almindelig fejl for begyndere, hvor programmøren prøver at bruge en klasse 'statisk' uden at foretage en forekomst af klassen. Der er flere betingelser, der skal være opfyldt, når du bruger en klasse, der er statisk. I denne artikel vil vi gennemgå flere forskellige tilfælde og guide dig om, hvordan du bruger en statisk klasse.

Hvad er en statisk metode?

Tilføjelse af nøgleordet 'statisk' til enhver metode gør metoden kendt som en statisk metode. En statisk metode hører til klassen snarere end at tilhøre et objekt (hvilket er normen). En statisk metode kan let påberåbes uden betingelse for at oprette en forekomst af en klasse.

Der er flere forskellige anvendelser af statiske metoder, for eksempel ved at bruge det kan du ændre et statisk datamedlem og dets værdi. Der er dog stadig nogle begrænsninger, når du bruger en statisk metode. Hvis du f.eks. Vil have adgang til ikke-statiske felter i din klasse, skal du bruge en ikke-statisk metode. Så for at opsummere bruges statiske metoder meget sparsomt, men de har deres fordele.

Her er et kort eksempel på, hvordan en statisk metode kan foretages til at ændre egenskaben for alle objekter.

klassestuderende {int roll_no; Strengnavn; statisk String college = "InformationTech"; statisk tomrumsændring () {college = “Management”;} Studerende (int-nummer, String name_self) {roll_no = number; name = name_self;} ugyldigt display () {System.out.println (rollno + "" + name + "" + college);} offentlig statisk ugyldig hoved (String args []) {Students.change (); Students stu_1 = new Students (100, "Mexican"); Students stud_2 = new Students (202, "American"); Students stud_3 = nye studerende (309, "britisk"); stu_1.display (); stu_2.display (); stu_3.display ();}}

Programmets output vil være:

100 mexicansk ledelse 202 amerikansk ledelse 309 britisk ledelse

Hvad er forskellen mellem en klasse og forekomst af en klasse?

Tror du går på gaden og ser en bil. Nu ved du straks, at dette er en bil, selvom du ikke ved, hvad der er dens model eller type. Dette skyldes, at du ved, at dette hører til den klasse af 'biler', som du allerede kender til. Tænk på klassen her som en skabelon eller en idé.

Når du bevæger dig tættere på, ser du bilens model og mærke. Her genkender du 'instansen' af klassen 'bil'. Her vil alle egenskaberne være til stede i detaljer; hjulene, hestekræfterne, fælgen osv.

Et eksempel på egenskaber kan være, at klassen 'bil' angiver, at alle biler skal have hjul. Den bil, du ser (en forekomst af bilklassen), har alufælge.

I objektorienteret programmering definerer du klassen selv og inde i klassen definerer du et felt af typen 'farve'. Når klassen er instiiteret, reserveres hukommelsen automatisk til farven i backend og senere, kan du give dette en bestemt værdi (for eksempel rød). Da egenskaber som disse er specifikke, er de ikke-statiske.

I modsætning hertil deles statiske metoder og felter med alle forekomster. Disse er lavet til værdi eller elementer, der er specifikke for klassen og ikke selve forekomsten. For metoder kan der være globale metoder (for eksempel stringtoInt converter), og for felter er de normalt konstanter i henhold til din kode (for eksempel kan biltypen være statisk, hvis du kun fremstiller normale biler).

Nu ser vi på alle de forskellige tilfælde, hvor din kodning kan gå galt, og se løsningerne for at rette dem.

Udgave 1: Du kalder noget, der ikke findes

Vi stødte på nogle tilfælde, hvor brugerne brugte både statiske og ikke-statiske metoder med hinanden. Når vi gør dette, skal du være forsigtig med, hvilken metode der kalder hvad (i form af statisk eller ej). Se på følgende kode:

private java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Følgende udsagn forårsager fejlen. Du ved hvorfor .. java.util.List someList = someMethod (); }

Her kalder den statiske metode nogle metoder. I objektorienteret programmering indkapsler vi dataene sammen med de data, som vi vil operere på. Her, uden et objekt, er der ingen instansdata, og mens instansmetoderne findes som en del af klassedefinitionen, skal der altid være en objektforekomst, der giver data til dem.

Så for at opsummere kan du ikke kalde noget, der ikke findes. Da du muligvis ikke har oprettet et objekt, findes den ikke-statiske metode ikke endnu. På den anden side vil der altid være en statisk metode (på grund af definition).

Udgave 2: Metoder gøres ikke statiske

Hvis du påkalder metoder fra din Static-hovedmetode uden at oprette en forekomst af metoderne, får du en fejlmeddelelse. Her gælder det samme princip; du kan ikke få adgang til noget, der ikke findes.

offentlig klasse BookStoreApp2 {// konstanter for valgmuligheder Scannerinput = ny scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // declaring array item = new BookStoreItem [10]; // initializing array int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // end of switch statement} // end of for loop for (int i = 0; i <item.length; i ++) {} // end af for} // slutningen af ​​hovedmetoden

Her i denne kode skal du konvertere begge metoder printMenu () og getUserChoice () ind i statiske metoder.

Derfor, hvis du vil komme rundt i en situation som denne, kan du bruge en konstruktør i stedet. For eksempel kan du tage indholdet af din hovedmetode () og placere dem inde i en konstruktør.

public BookStoreApp2 () {// Sæt indholdet af hovedmetoden her} Når du har gjort dette, skal du gøre følgende inden for din main () -metode: public void main (String [] args) {new BookStoreApp2 (); }

Hvis disse tip ikke fungerer på din eller din kode er anderledes, skal du huske de grundlæggende principper for statiske klasser og metoder og kontrollere din kode igen for at sikre, at det grundlæggende princip ikke overtrædes.

$config[zx-auto] not found$config[zx-overlay] not found