Gidai

NUSTATYTI: Ne statinis metodas negali būti nurodomas iš statinio konteksto

Daugelis programuotojų susiduria su klaidos pranešimuNe statinis metodas negali būti nurodomas statiniame kontekste’Kai jie koduoja. Šis klaidos pranešimas nėra konkretus ir gali atsirasti bet kurioje IDE, jei įvykdytos klaidos sąlygos.

Tai labai dažna klaida pradedantiesiems, kai programuotojas bando naudoti klasę „statiškai“, nepadarydamas klasės egzemplioriaus. Yra kelios sąlygos, kurių reikia laikytis, kai naudojate klasę, kuri yra statinė. Šiame straipsnyje mes apžvelgsime keletą skirtingų atvejų ir nurodysime, kaip naudoti statinę klasę.

Kas yra statinis metodas?

Pridėjus raktinį žodį „statinis“ prie bet kurio metodo, metodas žinomas kaip statinis metodas. Statinis metodas priklauso klasei, o ne objektui (o tai yra norma). Statinį metodą galima lengvai naudoti be sąlygos sukurti klasės egzempliorių.

Yra keli skirtingi „Static“ metodų naudojimo būdai, pavyzdžiui, naudodamiesi juo galite pakeisti statinių duomenų narį ir jo vertę. Tačiau naudojant „Static“ metodą vis dar yra tam tikrų apribojimų. Pavyzdžiui, jei norite pasiekti ne statinius savo klasės laukus, turite naudoti ne statinį metodą. Taigi apibendrinant, statiniai metodai naudojami labai retai, tačiau jie turi savo privalumų.

Čia pateikiamas trumpas pavyzdys, kaip galima statinį metodą pakeisti visų objektų ypatybėms.

klasės mokiniai {int roll_no; Stygos pavadinimas; statinis styginių koledžas = "InformationTech"; static void change () {college = “Management”;} Studentai (int numeris, String name_self) {roll_no = numeris; name = name_self;} negaliojantis ekranas () {System.out.println (rollno + "" + vardas + "" + kolegija);} public static void main (String args []) {Students.change (); Studentai stu_1 = nauji studentai (100, "meksikiečiai"); Studentai stu_2 = nauji studentai (202, "amerikiečiai"); studentai stu_3 = nauji studentai (309, „britai“); stu_1.display (); stu_2.display (); stu_3.display ();}}

Programos rezultatas bus:

100 Meksikos valdymas 202 Amerikos valdymas 309 Didžiosios Britanijos valdymas

Koks skirtumas tarp klasės ir klasės egzemplioriaus?

Pagalvokite, kad einate gatve ir pamatote automobilį. Dabar iškart žinote, kad tai automobilis, net jei nežinote, koks jo modelis ar tipas. Taip yra todėl, kad jūs žinote, kad tai priklauso „automobilių“ klasei, kurią jau žinote. Galvok apie klasę čia kaip apie šabloną ar idėją.

Dabar, kai judate arčiau, pamatote automobilio modelį ir markę. Čia atpažįstate klasės „automobilis“ „egzempliorių“. Čia visos savybės bus išsamiai aprašytos; ratai, arklio galia, ratlankiai ir kt.

Savybių pavyzdys gali būti tai, kad klasės „automobilis“ teigia, kad visi automobiliai turėtų turėti ratus. Automobilis, kurį matote (automobilių klasės pavyzdys), turi lengvojo lydinio ratlankius.

Programuodami į objektą, jūs patys apibrėžiate klasę, o klasės viduje - „color“ tipo lauką. Kiekvieną kartą kuriant klasę, atmintis automatiškai rezervuojama užpakalinėje dalyje esančioms spalvoms, o vėliau galite tai suteikti tam tikrą vertę (pavyzdžiui, raudoną). Kadangi tokie atributai yra specifiniai, jie nėra statiniai.

Priešingai, statiniai metodai ir laukai yra bendrinami su visais egzemplioriais. Jie skirti vertei ar daiktams, kurie būdingi konkrečiai klasei, o ne pačiam egzemplioriui. Metodams gali būti visuotiniai metodai (pvz., „StringtoInt“ keitiklis), o laukams jie paprastai yra konstantos pagal jūsų kodą (pavyzdžiui, automobilio tipas gali būti statiškas, jei gaminate tik įprastus automobilius).

Dabar mes apžvelgsime visus skirtingus atvejus, kai jūsų kodavimas gali suklysti, ir pamatysime, kaip juos išspręsti.

1 klausimas: skambinate tam, ko nėra

Susidūrėme su kai kuriais atvejais, kai vartotojai tarpusavyje naudojo statinius ir nestatinius metodus. Kai tai darysime, turėtumėte būti atsargūs, koks metodas vadinamas (statiniu ar ne). Pažvelkite į šį kodą:

privatus java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Šis sakinys sukelia klaidą. Jūs žinote, kodėl .. java.util.List someList = someMethod (); }

Čia statinis metodas vadina kai kuriuosMethod. Programuodami objektinį objektą, mes apibendriname duomenis kartu su duomenimis, kuriuos norime valdyti. Čia, be objekto, nėra egzempliorių duomenų ir nors egzempliorių metodai egzistuoja kaip klasės apibrėžimo dalis, visada turėtų būti objekto egzempliorius, teikiantis jiems duomenis.

Taigi, apibendrinant, negalima vadinti to, ko nėra. Kadangi galbūt nesate sukūrę objekto, dar nėra statinio metodo. Tačiau, kita vertus, statinis metodas visada egzistuos (dėl apibrėžimo).

2 klausimas: Metodai nėra statiniai

Jei naudojate metodus iš pagrindinio „Static“ metodo nesukūrę metodų egzemplioriaus, gausite klaidos pranešimą. Čia galioja tas pats principas; jūs negalite pasiekti to, ko nėra.

public class BookStoreApp2 {// parinkčių konstantos Skaitytuvo įvestis = naujas skaitytuvas (System.in); public static void main (String [] args) {BookStoreItem [] item; // masyvo elemento deklaravimas = new BookStoreItem [10]; // masyvo int inicijavimas itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // jungiklio teiginio pabaiga} // ciklo pabaiga for (int i = 0; i <item.length; i ++) {} // end iš for} // pagrindinio metodo pabaiga

Šiame kode turite konvertuoti abu metodus printmeniu () ir getUserChoice () į statinius metodus.

Taigi, jei norite apeiti tokią situaciją, galite naudoti a konstruktorius vietoj to. Pavyzdžiui, galite paimti savo pagrindinio () metodo turinį ir įdėti juos į konstruktorių.

public BookStoreApp2 () {// Čia įdėkite pagrindinio metodo turinį} Tai atlikę, atlikite šiuos veiksmus savo main () metodo viduje: public void main (String [] args) {new BookStoreApp2 (); }

Jei šie patarimai neveikia jūsų kodo ar jūsų kodas skiriasi, turėtumėte nepamiršti pagrindinių „Static“ klasių ir metodų principų ir dar kartą patikrinti kodą, kad įsitikintumėte, jog pagrindinis principas nėra pažeistas.

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