Oprava: Nestatická metoda nemůže být odkazována ze statického kontextu

Mnoho programátorů čelí chybové zprávě „ Nestatická metoda nemůže být odkazována ze statického kontextu “, když kódují. Tato chybová zpráva není specifická a může nastat v kterémkoli IDE, pokud jsou podmínky chyby pravdivé.

Nestatickou metodu nelze odkazovat ze statického kontextu

Jedná se o velmi častou chybu pro začátečníky, kde se programátor snaží použít třídu „staticky“, aniž by třídy vytvořil. Pokud používáte třídu, která je statická, musí být splněno několik podmínek. V tomto článku si projdeme několik různých případů a uvedeme vás, jak používat statickou třídu.

Co je statická metoda?

Přidání klíčového slova „statický“ do jakékoli metody způsobí, že je tato metoda známá jako statická metoda. Statická metoda patří spíše do třídy, než patří k objektu (což je norma). Statickou metodu lze snadno vyvolat bez podmínky vytvoření instance třídy.

Existuje několik různých použití statických metod, například, můžete jej použít, můžete změnit statický datový člen a jeho hodnotu. Při použití statické metody však stále existují určitá omezení. Pokud například chcete přistupovat k nestatickým polím své třídy, musíte použít nestatickou metodu. Abychom to shrnuli, statické metody se používají velmi zřídka, ale mají své výhody.

Zde je krátký příklad toho, jak lze provést statickou metodu ke změně vlastnosti všech objektů.

 třída Studenti {int roll_no; Název řetězce; static String college = "InformationTech"; static void change () {college = “Management”;} Studenti (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 (); Studenti stu_1 = noví studenti (100, „Mexičan“); Studenti stu_2 = noví studenti (202, „Američan“); Studenti stu_3 = noví studenti (309, „Britové“); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Výstupem programu bude:

 100 Mexický management 202 Americký management 309 Britský management 

Jaký je rozdíl mezi třídou a instancí třídy?

Mysli, že jdete po ulici a vidíte auto. Nyní okamžitě víte, že se jedná o auto, i když nevíte, jaký je jeho model nebo typ. Je to proto, že víte, že to patří do třídy „aut“, o které už víte. Mysli na tu jako na šablonu nebo nápad.

Nyní, když se přiblížíte, uvidíte model a značku vozu. Zde rozpoznáváte „instanci“ třídy „auto“. Zde budou podrobně uvedeny všechny vlastnosti; kola, koňská síla, ráfky atd.

Příkladem vlastností může být to, že třída 'auto' uvádí, že všechna auta by měla mít kola. Auto, které vidíte (příklad třídy auta), má slitinové ráfky.

V objektově orientovaném programování definujete třídu sami a uvnitř třídy definujete pole typu 'color'. Kdykoli je třída instancí, paměť je automaticky rezervována pro barvu na pozadí a později, můžete jí dát konkrétní hodnotu (například červená). Protože atributy jako tyto jsou specifické, nejsou statické.

Naproti tomu statické metody a pole jsou sdíleny se všemi instancemi. Jsou vytvořeny pro hodnotu nebo položky, které jsou specifické pro danou třídu, nikoli pro samotnou instanci. Pro metody mohou existovat globální metody (například převodník stringtoInt) a pro pole jsou obvykle konstanty podle vašeho kódu (například typ automobilu může být statický, pokud vyrábíte pouze normální auta).

Nyní se podíváme na všechny různé případy, kdy se vaše kódování může pokazit, a uvidíme řešení, jak je opravit.

Problém 1: Voláte něco, co neexistuje

Narazili jsme na některé případy, kdy uživatelé používali mezi sebou statické i nestatické metody. Když to děláme, měli byste si dát pozor na to, co metoda volá co (z hlediska statického nebo ne). Podívejte se na následující kód:

 soukromý java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Následující příkaz způsobí chybu. Víte, proč .. java.util.List someList = someMethod (); } 

Zde statická metoda volá someMethod. V objektově orientovaném programování zapouzdřujeme data spolu s daty, na kterých chceme pracovat. Zde bez objektu neexistují žádná data instance a zatímco metody instance existují jako součást definice třídy, vždy by měla existovat instance objektu, která jim poskytne data.

Abych to shrnul, nemůžete nazvat něčím, co neexistuje. Protože jste možná ještě nevytvořili žádný objekt, dosud neexistuje statická metoda. Na druhou stranu však vždy existuje statická metoda (kvůli definici).

Problém 2: Metody se nestávají statickými

Pokud vyvoláváte metody z hlavní statické metody bez vytvoření instance metod, zobrazí se chybová zpráva. Zde platí stejný princip; nemůžete získat přístup k něčemu, co neexistuje.

 public class BookStoreApp2 {// konstanty pro volby 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 (); pro (int i = 0; i <item.length; i ++) {} // konec příkazu switch} // konec for pro smyčku pro (int i = 0; i <item.length; i ++) {} // end of for} // konec hlavní metody 

Zde v tomto kódu musíte převést metody printMenu () a getUserChoice () na statické metody.

Pokud tedy chcete obejít takovou situaci, můžete místo toho použít konstruktor . Můžete například vzít obsah hlavní metody () a umístit je do konstruktoru.

 public BookStoreApp2 () {// Sem vložte obsah hlavní metody} Poté proveďte uvnitř vaší main () metody následující: public void main (String [] args) {new BookStoreApp2 (); } 

Pokud tyto tipy na vašem kódu nefungují nebo se váš kód liší, měli byste mít na paměti základní principy statických tříd a metod a znovu zkontrolovat kód, abyste se ujistili, že není porušován základní princip.

Zajímavé Články