Soluție: Metoda nestatică Nu poate fi trimisă dintr-un context static

Mulți programatori se confruntă cu mesajul de eroare „ Metoda non-statică nu poate fi făcută referire dintr-un context static ” atunci când codifică. Acest mesaj de eroare nu este specific și poate apărea în orice IDE dacă condițiile pentru eroare sunt adevărate.

Metoda nestatică Nu poate fi trimisă dintr-un context static

Aceasta este o greșeală foarte frecventă pentru începători, în cazul în care programatorul încearcă să folosească o clasică „static”, fără a face o instanță a clasei. Există mai multe condiții care trebuie îndeplinite atunci când utilizați o clasă care este statică. În acest articol, vom parcurge mai multe cazuri diferite și vă vom ghida despre cum să utilizați o clasă statică.

Ce este o metodă statică?

Adăugarea cuvântului cheie „static” la orice metodă face ca metoda să fie cunoscută sub numele de metodă statică. O metodă statică aparține clasei și nu aparține unui obiect (care este norma). O metodă statică poate fi invocată cu ușurință fără condiția creării unei instanțe a unei clase.

Există mai multe utilizări diferite ale metodelor statice, de exemplu, folosind-o, puteți modifica un membru de date statice și valoarea acestuia. Cu toate acestea, există încă unele limitări atunci când se utilizează o metodă statică. De exemplu, dacă doriți să accesați câmpuri nestatice ale clasei dvs., trebuie să utilizați o metodă nestatică. Așadar, pentru a rezuma, metodele statice se folosesc foarte mult, dar au beneficiile lor.

Iată un scurt exemplu despre cum se poate face o metodă statică pentru a schimba proprietatea tuturor obiectelor.

 clase Studenți {int roll_no; Numele șirului; static String college = "InformationTech"; static void change () {college = "Management";} Studenți (număr int, String name_self) {roll_no = number; name = name_self;} void display () {System.out.println (rollno + "" + nume + "" + facultate);} public static void principal (String args []) {Students.change (); Studenți stu_1 = Studenți noi (100, "mexicani"); Studenți stu_2 = Studenți noi (202, "americani"); Studenți stu_3 = studenți noi (309, „britanici”); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Produsul programului va fi:

 100 Management mexican 202 Management american 309 Management britanic 

Care este diferența dintre o clasă și o instanță a unei clase?

Gândește-te că mergi pe stradă și vezi o mașină. Acum știți imediat că aceasta este o mașină, chiar dacă nu știți care este modelul sau tipul ei. Acest lucru se datorează faptului că știi că aceasta aparține clasei de „mașini” despre care știi deja. Gândiți-vă la clasă aici ca un șablon sau o idee.

Acum, pe măsură ce vă apropiați, vedeți modelul și marca automobilului. Aici recunoașteți „instanța” clasei „mașină”. Aici toate proprietățile vor fi prezente în detaliu; roțile, caii putere, jantele etc.

Un exemplu de proprietăți poate fi faptul că clasa „mașină” afirmă că toate mașinile ar trebui să aibă roți. Mașina pe care o vedeți (un exemplu al clasei de mașini) are jante din aliaj.

În programarea orientată pe obiect, definiți singuri clasa și în interiorul clasei, definiți un câmp al tipului „culoare”. Ori de câte ori clasa este inițiată, memoria este rezervată automat pentru culoarea din backend și, mai târziu, puteți da acestei valori o valoare specifică (de exemplu roșu). Deoarece atributele ca acestea sunt specifice, acestea nu sunt statice.

În schimb, metodele și câmpurile statice sunt partajate cu toate instanțele. Acestea sunt făcute pentru valoare sau elemente care sunt specifice clasei și nu instanței în sine. Pentru metode, pot exista metode globale (de exemplu, convertor stringtoInt), iar pentru câmpuri, acestea sunt de obicei constante în funcție de codul dvs. (de exemplu, tipul de mașină poate fi static dacă fabricați numai mașini normale).

Acum, vom analiza toate cazurile în care codarea dvs. poate merge greșit și vom vedea soluțiile de rezolvare a acestora.

Problema 1: Apelați la ceva care nu există

Am întâlnit unele cazuri în care utilizatorii foloseau atât metode statice cât și nestatice între ele. Când facem acest lucru, ar trebui să fii atent la ce metodă se numește ce (în termeni de static sau nu). Uitați-vă la următorul cod:

 private java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Următoarea declarație provoacă eroarea. Știți de ce .. java.util.List someList = someMethod (); } 

Aici, metoda statică se numește someMethod. În programarea orientată pe obiect, încapsulăm datele împreună cu datele pe care vrem să le activăm. Aici, fără un obiect, nu există date de instanță și, în timp ce metodele de instanță există ca parte a definiției clasei, ar trebui să existe întotdeauna o instanță obiect care să le ofere date.

Deci, pentru a rezuma, nu puteți apela la ceva care nu există. Întrucât este posibil să nu fi creat un obiect, metoda nestatică nu există încă. Cu toate acestea, pe de altă parte, o metodă statică va exista întotdeauna (din cauza definiției).

Problema 2: Metodele nu sunt făcute statice

Dacă invocați metode din metoda principală statică fără a crea o instanță a acestor metode, veți primi un mesaj de eroare. Aici se aplică același principiu; nu puteți accesa ceva care nu există.

 public class BookStoreApp2 {// constante pentru opțiuni Scanner input = new Scanner (System.in); public static void main (String [] args) {BookStoreItem []; // declararea articolului array = new BookStoreItem [10]; // inițializarea tabloului int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // statement of switch switch} // end of for loop pentru (int i = 0; i <item.length; i ++) {} // end of for} // sfârșitul metodei principale 

Aici, în acest cod, trebuie să convertiți atât metodele printMenu () cât și getUserChoice () în metode statice.

Prin urmare, dacă doriți să ocoliți o situație de genul acesta, puteți utiliza un constructor în schimb. De exemplu, puteți lua conținutul metodei dvs. principale () și a le plasa în interiorul unui constructor.

 public BookStoreApp2 () {// Puneți conținutul metodei principale aici} După ce faceți acest lucru, faceți următoarele în metoda principală (): public void principal (String [] args) {new BookStoreApp2 (); } 

Dacă aceste sfaturi nu funcționează pe codul dvs. sau codul dvs. este diferit, ar trebui să rețineți principiile de bază ale claselor și metodelor statice și să verificați codul pentru a vă asigura că principiul de bază nu este încălcat.

Articole Interesante