Sprievodcovia

Oprava: Na nestatickú metódu nie je možné odkazovať zo statického kontextu

Mnoho programátorov čelí chybovému hláseniu „Na nestatickú metódu sa nedá odkazovať zo statického kontextu‘Keď kódujú. Táto chybová správa nie je konkrétna a môže sa vyskytnúť v akomkoľvek prostredí IDE, ak sú splnené podmienky chyby.

Toto je veľmi častá chyba pre začiatočníkov, keď sa programátor snaží použiť triedu „staticky“ bez uskutočnenia inštancie triedy. Existuje niekoľko podmienok, ktoré musíte splniť, keď používate statickú triedu. V tomto článku si prejdeme niekoľko rôznych prípadov a prevedieme vás používaním statickej triedy.

Čo je to statická metóda?

Pridanie kľúčového slova „statický“ k akejkoľvek metóde spôsobí, že bude táto metóda známa ako statická metóda. Statická metóda patrí skôr do triedy ako do objektu (čo je norma). Statickú metódu je možné ľahko vyvolať bez podmienky vytvorenia inštancie triedy.

Existuje niekoľko rôznych použití statických metód, napríklad pri ktorých môžete zmeniť statický údajový člen a jeho hodnotu. Pri použití statickej metódy však stále existujú určité obmedzenia. Napríklad, ak chcete získať prístup k nestatickým poliam svojej triedy, musíte použiť nestatickú metódu. Stručne povedané, statické metódy sa používajú veľmi rezervne, majú však svoje výhody.

Tu je krátky príklad toho, ako je možné vykonať statickú metódu na zmenu vlastnosti všetkých objektov.

trieda Študenti {int roll_no; Názov reťazca; static String college = "InformationTech"; static void change () {college = “Management";} Students (int number, 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 (); Students stu_1 = new Students (100, "Mexican"); Students stu_2 = new Students (202, "American"); Students stu_3 = noví študenti (309, „britskí“); stu_1.display (); stu_2.display (); stu_3.display ();}}

Výstupom z programu bude:

100 Mexické vedenie 202 Americké vedenie 309 Britské vedenie

Aký je rozdiel medzi triedou a inštanciou triedy?

Myslite si, že idete po ulici a vidíte auto. Teraz okamžite viete, že ide o auto, aj keď neviete, aký je jeho model alebo typ. Je to tak preto, lebo viete, že patrí do triedy „automobilov“, o ktorej už viete. Premýšľajte o triede ako šablóne alebo nápade.

Keď sa priblížite, uvidíte model a značku automobilu. Tu spoznávate „inštanciu“ triedy „auto“. Tu budú podrobne uvedené všetky vlastnosti; kolesá, výkon, ráfiky atď.

Príkladom vlastností môže byť, že trieda ‘auto’ uvádza, že všetky autá by mali mať kolesá. Auto, ktoré vidíte (príklad triedy automobilov), má zliatinové ráfiky.

V objektovo orientovanom programovaní definujete triedu sami a vo vnútri triedy definujete pole typu „farba“. Kedykoľvek je inštancia triedy vytvorená, pamäť je automaticky vyhradená pre farbu na konci a neskôr, môžete tejto hodnote priradiť konkrétnu hodnotu (napríklad červenú). Pretože atribúty ako tieto sú špecifické, nie sú statické.

Naproti tomu statické metódy a polia sú zdieľané so všetkými inštanciami. Sú vyrobené pre hodnotu alebo položky, ktoré sú špecifické pre triedu, a nie pre samotnú inštanciu. Pre metódy môžu existovať globálne metódy (napríklad prevodník stringtoInt) a pre polia sú to obvykle konštanty podľa vášho kódu (napríklad typ automobilu môže byť statický, ak vyrábate iba bežné automobily).

Teraz sa pozrieme na všetky rôzne prípady, keď sa vaše kódovanie môže pokaziť, a uvidíme riešenia, ktoré ich majú opraviť.

Vydanie 1: Voláte niečo, čo neexistuje

Narazili sme na niektoré prípady, keď používatelia navzájom používali statické aj nestatické metódy. Keď to urobíme, mali by ste byť opatrní, aká metóda čo volá (z hľadiska statického alebo nie). Prezrite si nasledujúci kód:

private java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Nasledujúci príkaz spôsobí chybu. Viete prečo .. java.util.List someList = someMethod (); }

Tu statická metóda volá someMethod. V objektovo orientovanom programovaní zapuzdrujeme údaje spolu s údajmi, na ktorých chceme pracovať. Tu bez objektu neexistujú žiadne údaje inštancie a zatiaľ čo metódy inštancie existujú ako súčasť definície triedy, vždy by mala existovať inštancia objektu, ktorá im poskytuje údaje.

Takže keď to zhrnieme, nemôžete volať niečo, čo neexistuje. Pretože ste možno nevytvorili objekt, nestatická metóda zatiaľ neexistuje. Na druhej strane však statická metóda vždy bude existovať (z dôvodu definície).

Problém 2: Metódy nie sú statické

Ak vyvolávate metódy z hlavnej statickej metódy bez vytvorenia inštancie metód, zobrazí sa chybové hlásenie. Tu platí rovnaká zásada; nemôžete získať prístup k niečomu, čo neexistuje.

verejná trieda BookStoreApp2 {// konštanty pre možnosti Vstup skenera = nový Skener (System.in); public static void main (String [] args) {BookStoreItem [] item; // deklarovanie poľa item = new BookStoreItem [10]; // inicializácia poľa int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // koniec príkazu switch}} // koniec cyklu for pre (int i = 0; i <item.length; i ++) {} // koniec of for} // koniec hlavnej metódy

Tu v tomto kóde musíte previesť obidve metódy printMenu () a getUserChoice () do statických metód.

Preto, ak sa chcete vyhnúť situácii, ako je táto, môžete použiť a konštruktér namiesto toho. Môžete napríklad vziať obsah svojej metódy main () a umiestniť ich do konštruktora.

public BookStoreApp2 () {// Sem vložte obsah hlavnej metódy} Potom urobte vo vnútri svojej metódy main () toto: public void main (String [] args) {new BookStoreApp2 (); }

Ak tieto tipy nepracujú s vašim kódom alebo sa váš kód líši, mali by ste pamätať na základné princípy statických tried a metód a znova skontrolovať svoj kód, aby ste sa uistili, že tento princíp nie je porušený.

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