Guider

Fix: Ikke statisk metode kan ikke refereres til fra en statisk kontekst

Mange programmerere står overfor feilmeldingen ‘Ikke-statisk metode kan ikke refereres fra en statisk kontekst’Når de koder. Denne feilmeldingen er ikke spesifikk og kan forekomme i hvilken som helst IDE hvis forholdene for feilen er oppfylt.

Dette er en veldig vanlig feil for nybegynnere der programmereren prøver å bruke en klasse ‘statisk’ uten å gjøre en forekomst av klassen. Det er flere betingelser som må oppfylles når du bruker en klasse som er statisk. I denne artikkelen vil vi gå gjennom flere forskjellige saker og veilede deg om hvordan du bruker en statisk klasse.

Hva er en statisk metode?

Når du legger til nøkkelordet 'statisk' i en hvilken som helst metode, blir metoden kjent som en statisk metode. En statisk metode tilhører klassen i stedet for å tilhøre et objekt (som er normen). En statisk metode kan lett påberopes uten vilkår for å opprette en forekomst av en klasse.

Det er flere forskjellige bruksområder for statiske metoder, for eksempel ved å bruke den, kan du endre et statisk datamedlem og verdien. Imidlertid er det fortsatt noen begrensninger når du bruker en statisk metode. Hvis du for eksempel vil få tilgang til ikke-statiske felt i klassen din, må du bruke en ikke-statisk metode. For å oppsummere, brukes statiske metoder veldig sparsomt, men de har sine fordeler.

Her er et kort eksempel på hvordan en statisk metode kan lages for å endre egenskapen til alle objekter.

klasselever {int roll_no; Strengnavn; statisk String college = "InformationTech"; statisk tomromendring () {college = “Management”;} Studenter (int-nummer, String name_self) {roll_no = number; name = name_self;} ugyldig 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 = nye studenter (309, "britisk"); stu_1.display (); stu_2.display (); stu_3.display ();}}

Resultatet av programmet vil være:

100 meksikansk ledelse 202 amerikansk ledelse 309 britisk ledelse

Hva er forskjellen mellom en klasse og forekomst av en klasse?

Tror du går på gaten og ser en bil. Nå vet du straks at dette er en bil, selv om du ikke vet hva som er modell eller type. Dette er fordi du vet at dette tilhører klassen ‘biler’ som du allerede kjenner til. Tenk på klassen her som en mal eller en idé.

Når du nærmer deg, ser du modellen og modellen til bilen. Her kjenner du igjen 'instansen' av klassen 'bil'. Her vil alle eiendommene være tilstede i detalj; hjulene, hestekreftene, felgene osv.

Et eksempel på egenskaper kan være at klassen ‘bil’ sier at alle biler skal ha hjul. Bilen du ser (en forekomst av bilklassen) har lettmetallfelger.

I objektorientert programmering definerer du klassen selv og inne i klassen definerer du et felt av typen ‘farge’. Hver gang klassen blir instantiert, blir minnet automatisk reservert for fargen på bakenden og senere, kan du gi dette en spesifikk verdi (for eksempel rød). Siden attributter som disse er spesifikke, er de ikke-statiske.

I motsetning til dette deles statiske metoder og felt med alle forekomster. Disse er laget for verdi eller elementer som er spesifikke for klassen og ikke selve forekomsten. For metoder kan det være globale metoder (for eksempel stringtoInt converter), og for felt er de vanligvis konstanter i henhold til koden din (for eksempel kan biltypen være statisk hvis du bare produserer vanlige biler).

Nå vil vi se på alle de forskjellige tilfellene der kodingen din kan gå galt og se løsningene for å fikse dem.

Utgave 1: Du ringer noe som ikke eksisterer

Vi kom over noen tilfeller der brukere brukte både statiske og ikke-statiske metoder med hverandre. Når vi gjør dette, bør du være forsiktig med hvilken metode som kaller hva (når det gjelder statisk eller ikke). Ta en titt på følgende kode:

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

Her kaller den statiske metoden noen metoder. I objektorientert programmering kapsler vi inn dataene sammen med dataene vi ønsker å operere på. Her, uten et objekt, er det ingen forekomstdata, og mens forekomstmetodene eksisterer som en del av klassedefinisjonen, bør det alltid være en objektforekomst for å gi data til dem.

Så for å oppsummere kan du ikke ringe noe som ikke eksisterer. Siden du kanskje ikke har opprettet et objekt, eksisterer ikke den ikke-statiske metoden ennå. Imidlertid vil en statisk metode alltid eksistere (på grunn av definisjon).

Utgave 2: Metoder blir ikke gjort statiske

Hvis du påkaller metoder fra din Static-hovedmetode uten å opprette en forekomst av metodene, får du en feilmelding. Her gjelder det samme prinsippet; du får ikke tilgang til noe som ikke eksisterer.

offentlig klasse BookStoreApp2 {// konstanter for alternativer Skannerinngang = 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 (); 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 av for} // slutten av hovedmetoden

Her i denne koden må du konvertere begge metodene printMenu () og getUserChoice () inn i statiske metoder.

Derfor, hvis du vil komme deg rundt en situasjon som denne, kan du bruke en konstruktør i stedet. For eksempel kan du ta innholdet i hovedmetoden () og plassere dem inne i en konstruktør.

public BookStoreApp2 () {// Sett innholdet av hovedmetoden her} Etter å ha gjort dette, gjør du følgende i din main () -metode: public void main (String [] args) {new BookStoreApp2 (); }

Hvis disse tipsene ikke virker på koden din eller er annerledes, bør du huske på de grunnleggende prinsippene for statiske klasser og metoder og sjekke koden på nytt for å sikre at grunnprinsippet ikke brytes.

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