Поправка: Нестатичка метода се не може позивати из статичког контекста

Многи се програмери суочавају са поруком о грешци „ Нестатичка метода се не може навести из статичког контекста “ када их кодирају. Ова порука о грешци није специфична и може се појавити у било којој ИДЕ ако су услови за грешку тачни.

Нестатичка метода се не може позивати из статичког контекста

Ово је врло честа грешка за почетнике где програмер покушава да користи класу 'статички', а да не направи инстанцу класе. Постоји неколико услова које морате испунити када користите класу која је статична. У овом ћемо чланку проћи кроз неколико различитих случајева и упутити вас како користити статичку класу.

Шта је статичка метода?

Додавање кључне речи „статички“ било којој методи чини методу познатим као статичка метода. Статичка метода припада класи, а не припада неком објекту (што је норма). Статичка метода се може лако позвати без услова креирања инстанције класе.

На пример, постоји неколико различитих употреба статичких метода, помоћу њих можете променити статички члан података и његову вредност. Међутим, још увијек постоје одређена ограничења код кориштења статичке методе. На пример, ако желите да приступите нестатичким пољима своје класе, морате да користите нестатичку методу. Укратко, статичке методе се користе врло ретко, али имају своје користи.

Ево кратког примера како се може направити статичка метода за промену својстава свих објеката.

 Студенти разреда {инт ролл_но; Име низа; статиц Стринг цоллеге = "ИнформатионТецх"; статиц воид цханге () {цоллеге = "Манагемент";} Студенти (инт број, стринг-наме_селф) {ролл_но = број; наме = наме_селф;} воид дисплаи () {Систем.оут.принтлн (роллно + "" + име + "" + факултет);} јавни статички воид маин (Стринг аргс []) {Студентс.цханге (); Студенти сту_1 = нови Студенти (100, "Мексиканци"); Студенти сту_2 = нови Студенти (202, "Американац"); Студенти сту_3 = нови студенти (309, "британски"); сту_1.дисплаи (); сту_2.дисплаи (); сту_3.дисплаи ();}} 

Резултат програма биће:

 100 мексичког менаџмента 202 америчког менаџмента 309 британског менаџмента 

Која је разлика између класе и инстанце класе?

Помислите да ходате улицом и видите ауто. Сада одмах знате да је ово аутомобил чак и ако не знате који је његов модел или тип. То је зато што знате да то спада у класу 'аутомобила' које већ знате. Овде размишљајте о класи као предлошку или идеји.

Када се приближавате, видите модел и модел аутомобила. Овде препознајете 'примерак' класе 'аутомобил'. Овде ће сва својства бити детаљно представљена; точкови, коњске снаге, фелне итд.

Пример својстава може бити да класа 'цар' наводи да сви аутомобили требају имати точкове. Аутомобил који видите (примерак класе аутомобила) има легуре фелне.

У објектно оријентираном програмирању сами дефинирате класу, а унутар класе дефинирате поље типа 'боја'. Кад год је класа инстанцирана, меморија се аутоматски резервише за боју у позадини и касније, можете јој дати одређену вредност (на пример црвену). Пошто су атрибути попут ових специфични, они су нестатични.

Супротно томе, статичке методе и поља се деле са свим инстанцама. Они су направљени за вредности или ставке које су специфичне за класу, а не за саму инстанцу. За методе могу постојати глобалне методе (на пример, конвертор стрингтоИнт), а за поља су обично константе према вашем коду (на пример, тип аутомобила може бити статичан ако производите само уобичајене аутомобиле).

Сада ћемо погледати све различите случајеве у којима ваше кодирање може поћи по злу и видећемо решења како их поправити.

Питање 1: Ви зовете нешто што не постоји

Наишли смо на неке случајеве у којима су корисници користили и статичке и нестатичке методе. Када то учинимо, требало би да пазите која метода позива шта (у смислу статичког или не). Погледајте следећи код:

 привате јава.утил.Лист сомеМетход () {/ * Неки код * / ретурн сомеЛист; } јавни статички воид маин (Стринг [] стрАргс) {// Следећа изјава узрокује грешку. Знате зашто .. јава.утил.Лист сомеЛист = сомеМетход (); } 

Овде се статична метода зове некиМетход. У објектно оријентисано програмирање инкапсулирамо податке заједно са подацима на којима желимо да радимо. Овде без објекта нема података о инстанцама и док методе инстанце постоје као део дефиниције класе, увек треба постојати објектна инстанца која им пружа податке.

Дакле, укратко, не можете назвати нешто што не постоји. Пошто можда нисте креирали објект, нестатичка метода још увек не постоји. Међутим, са друге стране, статична метода ће увек постојати (због дефиниције).

Питање 2: Методе нису статичне

Ако призивате методе из своје главне методе Статиц, а да не креирате инстанцу метода, добићете поруку о грешци. Овде важи исти принцип; не можете да приступите нечему што не постоји.

 јавна класа БоокСтореАпп2 {// константе за опције Улаз скенера = нови скенер (Систем.ин); јавна статичка воид главна (Стринг [] аргс) {БоокСтореИтем [] ставка; // проглашавање арраи ставке = нова БоокСтореИтем [10]; // иницијализација арраи инт итемТипе = -1; принтМену (); гетУсерЦхоице (); фор (инт и = 0; и <итем.ленгтх; и ++) {} // крај изјаве прекидача} // крај фор петље за (инт и = 0; и <итем.ленгтх; и ++) {} // крај оф фор // // крај главне методе 

Овде у овом коду морате конвертовати и методе принтМену () и гетУсерЦхоице () у статичке методе.

Стога, ако желите заобићи ситуацију попут ове, умјесто тога можете користити конструктор . На пример, можете узети садржај своје главне () методе и сместити их у конструктор.

 публиц БоокСтореАпп2 () {// Овде ставите садржај главне методе} Након што то учините, урадите следеће унутар главне () методе: јавни воид маин (Стринг [] аргс) {нев БоокСтореАпп2 (); } 

Ако ови савети не делују на ваш или је ваш код другачији, имајте на уму основне принципе статичких класа и метода и поново провјерите код да бисте били сигурни да се основни принцип не крши.

Занимљиви Чланци