Vodniki

Popravek: Nestatične metode ni mogoče sklicati iz statičnega konteksta

Mnogi programerji se soočajo s sporočilom o napakiNestatične metode ni mogoče sklicevati iz statičnega konteksta', Ko kodirajo. To sporočilo o napaki ni specifično in se lahko pojavi v katerem koli IDE, če so pogoji za napako resnični.

To je zelo pogosta napaka za začetnike, ko programer poskuša razred uporabiti "statično", ne da bi naredil primerek razreda. Ko uporabljate razred, ki je statičen, je treba izpolniti več pogojev. V tem članku bomo preučili več različnih primerov in vas vodili, kako uporabljati statični razred.

Kaj je statična metoda?

Če kateri koli metodi dodate ključno besedo "static", je metoda znana kot statična metoda. Statična metoda pripada razredu in ne pripada predmetu (kar je običajno). Statično metodo je mogoče enostavno priklicati brez pogoja ustvarjanja primerka razreda.

Obstaja več različnih načinov uporabe statičnih metod, na primer z njo lahko spremenite statičnega podatkovnega člana in njegovo vrednost. Vendar pa pri uporabi statične metode še vedno obstajajo nekatere omejitve. Če želite na primer dostopati do nestatičnih polj svojega razreda, morate uporabiti nestatično metodo. Če povzamemo, se statične metode uporabljajo zelo redko, vendar imajo svoje prednosti.

Tu je kratek primer, kako lahko naredimo statično metodo za spreminjanje lastnosti vseh predmetov.

študentje razreda {int roll_no; Ime niza; static String college = "InformationTech"; statična sprememba praznine () {college = “Management";} Študenti (int številka, ime niza) {roll_no = number; name = ime_sebe;} void display () {System.out.println (rollno + "" + ime + "" + college);} public static void main (String args []) {Students.change (); Študenti stu_1 = novi študenti (100, "mehiški"); študenti stu_2 = novi študenti (202, "ameriški"); študenti stu_3 = novi študentje (309, "britanski"); stu_1.display (); stu_2.display (); stu_3.display ();}}

Rezultat programa bo:

100 mehiški management 202 ameriški management 309 britanski management

Kakšna je razlika med razredom in primerkom razreda?

Mislite, da hodite po ulici in vidite avto. Zdaj takoj veste, da je to avto, tudi če ne veste, kakšen je njegov model ali tip. To je zato, ker veste, da spada v razred "avtomobilov", za katerega že poznate. Tukajšnji pouk si predstavljajte kot predlogo ali idejo.

Ko se približate, vidite model in znamko avtomobila. Tukaj prepoznate "primer" razreda "avto". Tu bodo podrobno predstavljene vse lastnosti; kolesa, konjske moči, platišča itd.

Primer lastnosti je lahko ta, da razred 'avto' navaja, da bi morali imeti vsi avtomobili kolesa. Avto, ki ga vidite (primer razreda avtomobila) ima alu platišča.

V objektno usmerjenem programiranju razred določite sami, znotraj razreda pa polje tipa 'color'. Vsakič, ko se razred ustvari, je pomnilnik samodejno rezerviran za barvo v ozadju in kasneje lahko temu določite določeno vrednost (na primer rdeča). Ker so takšni atributi specifični, so nestatični.

Nasprotno pa so statične metode in polja v skupni rabi z vsemi primerki. Izdelane so za vrednost ali postavke, ki so značilne za razred in ne za primerek sam. Za metode so lahko globalne metode (na primer pretvornik stringtoInt), za polja pa so običajno konstante glede na vašo kodo (na primer tip avtomobila je lahko statičen, če izdelujete samo običajne avtomobile).

Zdaj bomo preučili vse različne primere, ko se lahko vaše kodiranje zmoti, in našli rešitve za njihovo odpravo.

1. izdaja: Pokličete nekaj, kar ne obstaja

Naleteli smo na nekaj primerov, ko so uporabniki med seboj uporabljali tako statične kot nestatične metode. Ko to počnemo, bodite previdni pri tem, katera metoda kliče kaj (v smislu statičnega ali ne). Oglejte si naslednjo kodo:

private java.util.List someMethod () {/ * Neka koda * / return someList; } public static void main (String [] strArgs) {// Naslednja izjava povzroči napako. Veste, zakaj .. java.util.List someList = someMethod (); }

Tu statična metoda prikliče someMethod. V objektno usmerjeno programiranje vključimo podatke skupaj s podatki, ki jih želimo operirati. Tu brez predmeta ni podatkov primerka in čeprav metode primerka obstajajo kot del definicije razreda, bi moral vedno obstajati primerek predmeta, ki bi jim zagotavljal podatke.

Če povzamemo, ne morete poklicati nečesa, kar ne obstaja. Ker morda niste ustvarili predmeta, nestatična metoda še ne obstaja. Po drugi strani pa bo statična metoda vedno obstajala (zaradi definicije).

2. izdaja: Metode niso statične

Če prikličete metode iz glavne metode Static, ne da bi ustvarili primerek metod, boste dobili sporočilo o napaki. Tu velja isto načelo; ne morete dostopati do nečesa, kar ne obstaja.

javni razred BookStoreApp2 {// konstante za možnosti Vnos optičnega bralnika = nov optični bralnik (System.in); public static void main (String [] args) {BookStoreItem [] item; // razglasitev elementa polja = new BookStoreItem [10]; // inicializacija polja int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // konec stavka preklopa} // konec zanke for for (int i = 0; i <item.length; i ++) {} // end of for} // konec glavne metode

Tu v tej kodi morate pretvoriti obe metodi printMenu () in getUserChoice () v statične metode.

Če želite torej rešiti takšno situacijo, lahko uporabite konstruktor namesto tega. Na primer, lahko vzamete vsebino metode main () in jo položite v konstruktor.

public BookStoreApp2 () {// Vstavite vsebino glavne metode sem} Po tem naredite naslednje v svoji glavni () metodi: public void main (String [] args) {new BookStoreApp2 (); }

Če ti nasveti ne delujejo ali je vaša koda drugačna, upoštevajte osnovna načela statičnih razredov in metod ter znova preverite kodo in se prepričajte, da osnovno načelo ni kršeno.

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