Oprava: Nestatická metóda sa nedá odkazovať zo statického kontextu

Mnoho programátorov sa pri kódovaní stretáva s chybovým hlásením „ Statická metóda sa nedá odkazovať zo statického kontextu “. Táto chybová správa nie je špecifická a môže sa vyskytnúť v ľubovoľnom IDE, ak sú podmienky pre chybu pravdivé.

Nestatická metóda sa nedá odkazovať zo statického kontextu

Toto je veľmi častá chyba pre začiatočníkov, keď sa programátor pokúša použiť triedu „staticky“ bez toho, aby urobil inštanciu triedy. Ak používate triedu, ktorá je statická, musíte splniť niekoľko podmienok. V tomto článku si preberieme niekoľko rôznych prípadov a ukážeme vám, ako používať statickú triedu.

Čo je statická metóda?

Pridaním kľúčového slova „static“ do ľubovoľnej metódy sa táto metóda nazýva statická metóda. Statická metóda patrí skôr do triedy, než patrí k objektu (čo je normou). 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, pomocou ktorých môžete zmeniť statický dátový č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 statickým poliam svojej triedy, musíte použiť nestatickú metódu. Aby som to zhrnul, statické metódy sa používajú veľmi zriedka, ale majú 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"; statická zmena void () {college = „Management“;} Študenti (int. číslo, String name_self) {roll_no = number; name = name_self;} void display () {System.out.println (rollno + "" + name + "" + vysoká škola);} verejné statické prázdno (String args []) {Students.change (); Študenti stu_1 = noví študenti (100, „Mexičan“); Študenti stu_2 = noví študenti (202, „Američania“); Študenti stu_3 = noví študenti (309, „Briti“); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Výstupom programu bude:

 100 Mexický manažment 202 Americký manažment 309 Britský manažment 

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

Mysli, ž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 preto, že viete, že to patrí do triedy „automobilov“, o ktorej už viete. Sem premýšľajte ako o šablóne alebo nápade.

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

Príkladom vlastností môže byť to, že trieda „auto“ uvádza, že všetky autá by mali mať kolesá. Auto, ktoré vidíte (príklad triedy auta), má zliatinové disky.

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

Naopak, statické metódy a polia sa zdieľajú so všetkými inštanciami. Vyrábajú sa pre hodnoty alebo položky, ktoré sú špecifické pre danú 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ú zvyčajne konštanty podľa vášho kódu (napríklad typ vozidla môže byť statický, ak vyrábate iba bežné vozidlá).

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

Problém 1: Voláte niečo, čo neexistuje

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

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

Tu statická metóda volá someMethod. V objektovo orientovanom programovaní zapuzdrujeme dáta spolu s údajmi, s ktorými chceme pracovať. Tu, bez objektu, neexistujú žiadne inštančné dáta a hoci inštančné metódy existujú ako súčasť definície triedy, vždy by mala existovať inštancia objektu, ktorá im poskytuje údaje.

Aby som to zhrnul, nemôžete nazvať niečo, čo neexistuje. Pretože ste možno ešte nevytvorili objekt, nestatická metóda ešte neexistuje. Na druhej strane však vždy bude existovať statická metóda (kvôli definícii).

Vydanie 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áte prístup k niečomu, čo neexistuje.

 public class BookStoreApp2 {// konštanty pre voľby Scanner input = new Scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // deklaring item item = new BookStoreItem [10]; // inicializing array int itemType = -1; printMenu (); getUserChoice (); pre (int i = 0; i <item.length; i ++) {} // koniec príkazu switch} // koniec for loop pre (int i = 0; i <item.length; i ++) {} // end of for // // koniec hlavnej metódy 

V tomto kóde je potrebné previesť metódy printMenu () a getUserChoice () na statické metódy.

Preto ak sa chcete obísť takou situáciou, môžete namiesto toho použiť konštruktor . Môžete napríklad zobrať obsah hlavnej metódy () a umiestniť ich do konštruktora.

 public BookStoreApp2 () {// Sem vložte obsah hlavnej metódy} Po vykonaní tohto postupu vykonajte vo vašej main () metóde: public void main (String [] args) {new BookStoreApp2 (); } 

Ak tieto tipy nefungujú vo vašom kóde alebo je váš kód iný, mali by ste pamätať na základné princípy statických tried a metód a znova skontrolovať kód, aby ste sa uistili, že nie je porušený základný princíp.

Zaujímavé Články