Parandus: mittestaatilisest meetodist ei saa staatilises kontekstis viidata

Paljud programmeerijad seisavad kodeerimisel silmitsi tõrketeatega " Mittestaatiline meetod ei saa staatilisest kontekstist lähtuda ". See tõrketeade pole konkreetne ja see võib ilmneda mis tahes IDE-s, kui tõrgetingimused on täidetud.

Mittestaatilisest meetodist ei saa staatilises kontekstis viidata

See on väga levinud viga algajatele, kus programmeerija proovib klassi staatiliselt kasutada, ilma klassi esinemisjuhu tegemata. Staatilise klassi kasutamisel peab olema täidetud mitu tingimust. Selles artiklis tutvume mitme erineva juhtumiga ja juhendame teid staatilise klassi kasutamiseks.

Mis on staatiline meetod?

Mis tahes meetodile märksõna 'staatiline' lisamine teeb selle meetodi staatiliseks meetodiks. Staatiline meetod kuulub pigem klassi kui objekti (see on norm). Staatilisele meetodile saab hõlpsasti tugineda ilma klassi eksemplari loomise tingimuseta.

Staatilisi meetodeid saab kasutada mitmel erineval viisil, näiteks selle abil saate muuta staatilist andmeliiget ja selle väärtust. Staatilise meetodi kasutamisel on siiski mõned piirangud. Näiteks kui soovite pääseda juurde oma klassi mittestaatilistele väljadele, peate kasutama mittestaatilist meetodit. Kokkuvõtlikult võib öelda, et staatilisi meetodeid kasutatakse väga vaevalt, kuid neil on oma eelised.

Siin on lühike näide sellest, kuidas saab staatilist meetodit kõigi objektide omaduste muutmiseks.

 klassi õpilased {int roll_no; Stringi nimi; staatiline keelpillikolledž = "InformationTech"; staatiline tühine muutus () {college = “Management";} Õpilased (int number, String name_self) {roll_no = number; name = name_self;} void display () {System.out.println (rollno + "" + name + "" + kolledž);} avalik staatiline tühine peaosa (keelpillid []) {Students.change (); Üliõpilased stu_1 = uued tudengid (100, "Mehhiko"); Üliõpilased stu_2 = uued tudengid (202, "Ameerika"); Õpilased stu_3 = uued õpilased (309, "britt"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Programmi väljund on järgmine:

 100 Mehhiko juhtimist 202 Ameerika juhtimist 309 Briti juhtimist 

Mis vahe on klassil ja klassi eksemplaril?

Arva, et kõnnid tänaval ja näed autot. Nüüd teate kohe, et see on auto, isegi kui te ei tea, mis on selle mudel või tüüp. Seda seetõttu, et teate, et see kuulub "autode" klassi, mida te juba teate. Mõelge klassile siin mallina või ideena.

Nüüd lähemale liikudes näete auto mudelit ja tootemarki. Siin tunnete ära klassi "auto" "esinemisjuhu". Siin on kõik omadused detailselt esindatud; rattad, hobujõud, veljed jne

Omaduste näide võib olla see, et klassi „auto” öeldakse, et kõigil autodel peaksid olema rattad. Autol, mida näete (autoklassi näide), on valuveljed.

Objektorienteeritud programmeerimisel määratlete klassi ise ja klassi sees määratlete välja 'tüüp'. Kui klass klassifitseeritakse, reserveeritakse mälu automaatselt taustavärvi jaoks ja hiljem saab sellele anda konkreetse väärtuse (näiteks punane). Kuna sellised atribuudid on spetsiifilised, pole nad staatilised.

Seevastu staatilisi meetodeid ja välju jagatakse kõigi esinemisjuhtudega. Need on loodud klassi jaoks spetsiifiliste väärtuste või üksuste jaoks, mitte eksemplari enda jaoks. Meetodite jaoks võivad olla globaalsed meetodid (näiteks stringtoInt muundur) ja väljade puhul on need teie koodi järgi tavaliselt konstandid (näiteks võib autotüüp olla staatiline, kui tootte ainult tavalisi autosid).

Nüüd vaatame kõiki erinevaid juhtumeid, kus teie kodeerimine võib valesti minna, ja vaatame nende parandamiseks vajalikke ümberseadiseid.

1. väljaanne: helistate millelegi, mida pole olemas

Me leidsime juhtumeid, kus kasutajad kasutasid üksteisega nii staatilisi kui ka mittestaatilisi meetodeid. Kui me seda teeme, peaksite olema ettevaatlik selle suhtes, milline meetod helistab millele (staatiliselt või mitte). Vaadake järgmist koodi:

 private java.util.List someMethod () {/ * Some Code * / return someList; } avalik staatiline tühine pea (String [] strArgs) {// Järgmine väide põhjustab tõrke. Tead miks ... java.util.List someList = someMethod (); } 

Staatiline meetod nimetab siin mõnda meetodit. Objektorienteeritud programmeerimisel kapseldame andmed koos andmetega, millega tahame töötada. Siin ei ole ilma objektita eksemplaride andmeid ja kuigi eksemplaride meetodid eksisteerivad klassi määratluse osana, peaks andmete esitamiseks alati olema objekti eksemplar.

Kokkuvõtteks võib öelda, et te ei saa helistada millelegi, mida pole olemas. Kuna te pole ehk objekti loonud, pole mittestaatilist meetodit veel olemas. Kuid teisest küljest on staatiline meetod alati olemas (määratluse tõttu).

2. väljaanne: Meetodeid ei muudeta staatilisteks

Kui kutsute meetodeid oma staatilise põhimeetodi alt ilma meetodite eksemplari loomata, kuvatakse tõrketeade. Siin kehtib sama põhimõte; te ei pääse juurde millelegi, mida pole olemas.

 public class BookStoreApp2 {// konstandid valikute jaoks Skanneri sisend = uus skanner (System.in); public static void main (String [] args) {BookStoreItem [] element; // massiiviüksuse deklareerimine = uus BookStoreItem [10]; // massiivi initsialiseerimine int itemType = -1; printMenu (); getUserChoice (); jaoks (int i = 0; i <üksuse pikkus; i ++) {} // lülituse lõppu lõpp} // silmuse lõpp jaoks (int i = 0; i <üksuse pikkus; i ++) {} // lõpp of for} // põhimeetodi lõpp 

Selles koodis peate nii meetodid printMenu () kui ka getUserChoice () muutma staatilisteks meetoditeks.

Seega, kui soovite sellises olukorras ringi liikuda, võite kasutada selle asemel konstruktorit . Näiteks võite võtta oma peamise () meetodi sisu ja paigutada need konstruktori sisse.

 public BookStoreApp2 () {// Pange siia põhimeetodi sisu} Pärast seda peate oma peamise () meetodi sees tegema järgmist: avalik void main (String [] args) {new BookStoreApp2 (); } 

Kui need näpunäited teie arvutis ei tööta või kui teie kood erineb, peaksite meeles pidama staatiliste klasside ja meetodite põhiprintsiipe ja kontrollima oma koodi uuesti, et veenduda, et seda põhimõtet ei rikuta.

Huvitavad Artiklid