Labojums: uz statisko metodi nevar atsaukties no statiskā konteksta

Daudzi programmētāji kodēšanas laikā saskaras ar kļūdas ziņojumu “Uz statisko metodi nevar atsaukties no statiskā konteksta ”. Šis kļūdas ziņojums nav specifisks, un tas var parādīties jebkurā IDE, ja kļūdas nosacījumi ir patiesi.

Ne statisku metodi nevar atsaukties no statiskā konteksta

Šī ir ļoti izplatīta kļūda iesācējiem, kad programmētājs mēģina izmantot klasi “statiski”, neizveidojot klases instanci. Ja izmantojat statisku klasi, ir jāizpilda vairāki nosacījumi. Šajā rakstā mēs apskatīsim vairākus dažādus gadījumus un sniegsim jums norādījumus par statiskās klases izmantošanu.

Kas ir statiskā metode?

Jebkurai metodei pievienojot atslēgvārdu “statisks”, metode tiek dēvēta par statisku metodi. Statiska metode pieder pie klases, nevis pieder objektam (kas ir norma). Uz statisko metodi var viegli atsaukties, neizveidojot nosacījumu klases gadījuma izveidošanai.

Pastāv vairākas atšķirīgas statisko metožu pielietošanas iespējas, piemēram, izmantojot to, jūs varat mainīt statisko datu dalībnieku un tā vērtību. Tomēr, izmantojot statisko metodi, joprojām ir daži ierobežojumi. Piemēram, ja vēlaties piekļūt savas klases nestatiskajiem laukiem, jums jāizmanto nestatiska metode. Rezumējot, statiskās metodes tiek izmantotas ļoti negaidīti, taču tām ir savas priekšrocības.

Šeit ir īss piemērs, kā var veikt statisku metodi, lai mainītu visu objektu īpašības.

 klases skolēni {int roll_no; Stīgas nosaukums; statiskā stīgu koledža = "InformationTech"; statiskas spēkā neesošas izmaiņas () {koledža = “Vadība”;} Studenti (int. numurs, virknes nosaukums_ pašsaprotami) {roll_no = skaitlis; name = name_self;} tukšs displejs () {System.out.println (rollno + "" + name + "" + koledža);} publiski statiskā tukšā galvenā (stīgas args []) {studenti.maina (); studenti stu_1 = jauni studenti (100, "meksikāņu"); studenti stu_2 = jauni studenti (202, "amerikāņu"); studenti stu_3 = jaunie studenti (309, "briti"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Programmas rezultāts būs:

 100 Mexican Management 202 American Management 309 British Management 

Kāda ir atšķirība starp klasi un klases instanci?

Domājiet, ka jūs ejat pa ielu un redzat automašīnu. Tagad jūs uzreiz zināt, ka šī ir automašīna, pat ja nezināt, kāds ir tās modelis vai tips. Tas ir tāpēc, ka jūs zināt, ka šī pieder “automašīnu” klasei, par kuru jūs jau zināt. Šeit padomājiet par klasi kā veidni vai ideju.

Tagad, tuvojoties tuvāk, jūs redzat automašīnas modeli un modeli. Šeit jūs atpazīstat klases “auto” “gadījumu”. Šeit tiks detalizēti aprakstīti visi īpašumi; riteņi, zirgspēks, diski utt.

Īpašību piemērs var būt tas, ka klases automašīnā teikts, ka visām automašīnām jābūt riteņiem. Automašīnai, kuru redzat (automašīnu klases piemērs), ir lietie diski.

Objektorientētā programmēšanā jūs pats definējat klasi, bet klasē - lauka “krāsa” lauku. Ikreiz, kad klase tiek aktualizēta, atmiņa tiek automātiski rezervēta aizmugures krāsai un vēlāk, jūs varat tai piešķirt īpašu vērtību (piemēram, sarkanu). Tā kā atribūti, piemēram, šie, ir specifiski, tie nav statiski.

Turpretī statiskās metodes un lauki tiek koplietoti ar visiem gadījumiem. Tie ir izgatavoti vērtībai vai priekšmetiem, kas ir raksturīgi klasei, nevis pašai instancei. Metodēm var būt globālas metodes (piemēram, pārveidotājs stringtoInt), un laukiem tās parasti ir konstantes atbilstoši jūsu kodam (piemēram, automašīnas tips var būt statisks, ja jūs ražojat tikai normālas automašīnas).

Tagad mēs apskatīsim visus dažādos gadījumus, kad kodēšana var noiet greizi, un apskatīsim risinājumus, kā tos novērst.

1. jautājums: jūs saucat kaut ko tādu, kas neeksistē

Mēs saskārāmies ar dažiem gadījumiem, kad lietotāji savā starpā izmantoja gan statiskās, gan nestatiskās metodes. Kad mēs to darām, jums vajadzētu būt uzmanīgam attiecībā uz to, kāda metode izsauc ko (statiska vai nē). Apskatiet šo kodu:

 privāts java.util.List someMethod () {/ * Some Code * / return someList; } publiski statiskā tukšā galvenā (virkne [] strArgs) {// Šo paziņojumu izraisa kļūda. Jūs zināt, kāpēc .. java.util.List someList = someMethod (); } 

Šeit statiskā metode izsauc someMethod. Objektorientētā programmēšanā mēs datus iekapsulējam kopā ar datiem, uz kuriem vēlamies darboties. Šeit bez objekta nav eksemplāru datu un, lai gan instanču metodes pastāv kā daļa no klases definīcijas, vienmēr ir jābūt objekta eksemplāram, lai viņiem sniegtu datus.

Rezumējot, jūs nevarat nosaukt kaut ko tādu, kas neeksistē. Tā kā jūs, iespējams, neesat izveidojis objektu, nestatiskā metode vēl neeksistē. Tomēr, no otras puses, vienmēr pastāvēs statiska metode (definīcijas dēļ).

2. izdevums: Metodes nav statiskas

Ja jūs izmantojat metodes no savas statiskās galvenās metodes, neizveidojot metožu instanci, jūs saņemsit kļūdas ziņojumu. Šeit piemēro to pašu principu; jūs nevarat piekļūt kaut kam, kas neeksistē.

 public class BookStoreApp2 {// konstantes opcijām Skeneru ievade = jauns skeneris (System.in); public static void main (virkne [] args) {BookStoreItem [] vienums; // masīva vienības deklarēšana = jauns BookStoreItem [10]; // masīva inicializēšana int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // pārslēgšanas paziņojuma beigas} // for cilpas beigas for (int i = 0; i <item.length; i ++) {} // end of for} // galvenās metodes beigas 

Šajā kodā gan metodes printMenu (), gan getUserChoice () jāpārvērš statiskās metodēs.

Tāpēc, ja vēlaties izkļūt no šādas situācijas, tā vietā varat izmantot konstruktoru . Piemēram, jūs varat ņemt savas galvenās () metodes saturu un ievietot to konstruktora iekšpusē.

 public BookStoreApp2 () {// Ievietojiet šeit galvenās metodes saturu} Pēc tam, veicot galveno () metodi, rīkojieties šādi: public void main (String [] args) {new BookStoreApp2 (); } 

Ja šie padomi nedarbojas ar jūsu kodu vai jūsu kods atšķiras, jums jāpatur prātā statiskās klases un metožu pamatprincipi un vēlreiz jāpārbauda kods, lai pārliecinātos, ka pamatprincips netiek pārkāpts.

Interesanti Raksti