Oppaat

Korjaus: Ei staattiseen menetelmään ei voida viitata staattisessa kontekstissa

Monet ohjelmoijat kohtaavat virheilmoituksen ”Ei-staattiseen menetelmään ei voida viitata staattisessa kontekstissa”Kun he koodaavat. Tämä virheilmoitus ei ole tarkka ja voi esiintyä missä tahansa IDE: ssä, jos virheen ehdot täyttyvät.

Tämä on hyvin yleinen virhe aloittelijoille, kun ohjelmoija yrittää käyttää luokkaa staattisesti tekemättä luokan esiintymää. On useita ehtoja, jotka on täytettävä käytettäessä staattista luokkaa. Tässä artikkelissa käymme läpi useita erilaisia ​​tapauksia ja opastamme, kuinka staattista luokkaa käytetään.

Mikä on staattinen menetelmä?

Avainsanan ”staattinen” lisääminen mihin tahansa menetelmään tunnistaa menetelmän staattisena menetelmänä. Staattinen menetelmä kuuluu luokkaan eikä esineeseen (mikä on normi). Staattiseen menetelmään voidaan helposti vedota ilman luokan ilmentymän luomisen ehtoa.

Staattisilla menetelmillä on useita eri käyttötapoja, esimerkiksi käyttämällä sitä, voit muuttaa staattisen datan jäsenen ja sen arvon. Staattisen menetelmän käytössä on kuitenkin vielä joitain rajoituksia. Esimerkiksi, jos haluat käyttää luokan staattisia kenttiä, sinun on käytettävä ei-staattista menetelmää. Yhteenvetona voidaan todeta, että staattisia menetelmiä käytetään hyvin harvoin, mutta niillä on etuja.

Tässä on lyhyt esimerkki siitä, miten staattinen menetelmä voidaan muuttaa kaikkien objektien ominaisuuksien muuttamiseksi.

luokan opiskelijat {int roll_no; Merkkijono nimi; staattinen merkkijono college = "InformationTech"; static void change () {college = “Management”;} Opiskelijat (int-numero, merkkijonon_ominaisuus) {roll_no = numero; nimi = name_self;} mitätön näyttö () {System.out.println (rollno + "" + nimi + "" + college);} public static void main (String args []) {Students.change (); Opiskelijat stu_1 = uudet opiskelijat (100, "meksikolaiset"); Opiskelijat stu_2 = uudet opiskelijat (202, "amerikkalaiset"); Opiskelijat stu_3 = uudet opiskelijat (309, "britit"); stu_1.display (); stu_2.display (); stu_3.display ();}}

Ohjelman tulos on:

100 Meksikon johto 202 Amerikan johto 309 Ison-Britannian johto

Mitä eroa on luokan ja luokan esiintymän välillä?

Luulen, että kävelet kadulla ja näet auton. Nyt tiedät heti, että tämä on auto, vaikka et tiedä mikä on sen malli tai tyyppi. Tämä johtuu siitä, että tiedät, että tämä kuuluu jo tunnettujen autojen luokkaan. Ajattele luokkaa tässä mallina tai ideana.

Nyt kun siirryt lähemmäksi, näet auton mallin ja merkin. Tässä tunnistat luokan ”auto” ”esiintymän”. Täällä kaikki ominaisuudet ovat läsnä yksityiskohtaisesti; pyörät, hevosvoima, vanteet jne.

Esimerkki ominaisuuksista voi olla se, että luokan ”auto” mukaan kaikilla autoilla tulisi olla pyörät. Autossa, jonka näet (esimerkiksi autoluokassa), on kevytmetallivanteet.

Kohdekeskeisessä ohjelmoinnissa määrität luokan itse ja luokan sisällä kentän, jonka tyyppi on 'väri'. Aina kun luokka tehdään, muisti varataan automaattisesti taustalla olevalle värille ja myöhemmin, voit antaa tälle tietyn arvon (esimerkiksi punaisen). Koska tällaiset attribuutit ovat spesifisiä, ne eivät ole staattisia.

Staattiset menetelmät ja kentät sitä vastoin jaetaan kaikille instansseille. Nämä tehdään arvolle tai kohteille, jotka ovat ominaisia ​​luokalle, eivät itse esiintymälle. Menetelmille voi olla yleisiä menetelmiä (esimerkiksi stringtoInt-muunnin) ja kentille ne ovat yleensä vakioita koodisi mukaan (esimerkiksi autotyyppi voi olla staattinen, jos valmistat vain normaaleja autoja).

Nyt tarkastelemme kaikkia erilaisia ​​tapauksia, joissa koodauksesi voi mennä pieleen, ja näemme kiertotavat niiden korjaamiseksi.

Numero 1: Soitat jotain, jota ei ole olemassa

Löysimme tapauksia, joissa käyttäjät käyttivät sekä staattisia että ei-staattisia menetelmiä keskenään. Kun teemme tämän, sinun tulee olla varovainen siitä, mikä menetelmä kutsuu mitä (staattisena vai ei). Katso seuraava koodi:

yksityinen java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Seuraava lause aiheuttaa virheen. Tiedät miksi .. java.util.List someList = someMethod (); }

Tässä staattinen menetelmä kutsuu jotakinMethod. Kohdekohtaisessa ohjelmoinnissa kapseloimme tiedot yhdessä niiden tietojen kanssa, joita haluamme käyttää. Täällä ilman kohdetta ei ole instanssitietoja, ja vaikka ilmentymämenetelmät ovat olemassa osana luokkamäärittelyä, heidän tulisi aina tarjota objektiinstanssi.

Joten yhteenvetona, et voi kutsua jotain, jota ei ole olemassa. Koska et ehkä ole luonut objektia, ei-staattista menetelmää ei ole vielä olemassa. Toisaalta staattinen menetelmä on kuitenkin aina olemassa (määritelmän takia).

Numero 2: Menetelmistä ei tehdä staattisia

Jos kutsut menetelmiä staattisesta päämetodistasi luomatta menetelmien esiintymää, saat virheilmoituksen. Tässä pätee sama periaate; et voi käyttää jotain, jota ei ole olemassa.

public class BookStoreApp2 {// vaihtoehtojen vakiot Skannerin syöttö = uusi Skanneri (System.in); public static void main (String [] args) {BookStoreItem [] item; // ilmoitetaan taulukon kohde = uusi BookStoreItem [10]; // alustetaan taulukko int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // kytkinlausekkeen loppu} // for -silmukan loppu for (int i = 0; i <item.length; i ++) {} // end of for} // päämenetelmän loppu

Tässä tässä koodissa sinun on muunnettava molemmat menetelmät printMenu () ja getUserChoice () staattisiin menetelmiin.

Jos siis haluat kiertää tällaisen tilanteen, voit käyttää a rakentaja sen sijaan. Voit esimerkiksi ottaa main () -metodisi sisällön ja sijoittaa ne konstruktorin sisälle.

public BookStoreApp2 () {// Laita päämenetelmän sisältö tähän} Kun olet tehnyt tämän, tee seuraava pää () -metodissasi: public void main (String [] args) {new BookStoreApp2 (); }

Jos nämä vinkit eivät toimi sinun koodissasi tai koodisi on erilainen, muista pitää staattisten luokkien ja menetelmien perusperiaatteet ja tarkistaa koodisi uudelleen varmistaaksesi, että perusperiaatetta ei loukata.

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