Metodat statike në Java (metodat statike). Anëtarët statikë dhe modifikuesi statik Një shembull i përdorimit të metodës statike në C

Anëtarët e klasës mund të përdoren me fjalën kyçe statike. Në këtë kontekst, kuptimi i tij është i ngjashëm me atë që ka në C. Kur një anëtar i klasës deklarohet si statik, përpiluesi udhëzohet që vetëm një kopje e atij anëtari duhet të ekzistojë, pavarësisht se sa objekte të asaj klase janë krijuar. . Një anëtar statik ndahet nga të gjitha objektet e një klase të caktuar. Të gjitha të dhënat statike inicializohen në zero kur krijohet objekti i parë dhe nuk ofrohet asnjë inicializim tjetër.

Kur deklaroni një anëtar të të dhënave statike të një klase, anëtari nuk përcaktohet. Në vend të kësaj, ju duhet të jepni një përkufizim global për ta jashtë klasës. Kjo bëhet duke rideklaruar variablin statik, duke përdorur operatorin scope për të identifikuar klasën së cilës i përket ndryshorja. Kjo është e nevojshme në mënyrë që memoria të ndahet për variablin statik.

Si shembull, merrni parasysh programin e mëposhtëm:

#përfshi
numëruesi i klasës (
numërimi statik int;
publike:
void setcount(int i) (count = i;);
void showcount()(cout<< count << " "; }
};
int counter::count; // përkufizimi i numërimit
int main() (
numëruesi a, b;
a.showcount(); // nxjerr 0
b.showcount(); // nxjerr 0
a.komplet (10); // vendosja e numërimit statik në 10
a.showcount(); // printime 10
b.showcount(); // gjithashtu nxjerr 10
kthimi 0;
}

Para së gjithash, le t'i kushtojmë vëmendje faktit që ndryshorja statike e numrit të tipit të plotë deklarohet në dy vende: në klasën numërues dhe më pas si variabël globale. Borland C++ inicializon numërimin në zero. Kjo është arsyeja pse thirrja e parë në showcount() kthen zero. Pastaj objekti a numëron në 10. Pastaj të dy objektet a dhe b shfaqin të njëjtën vlerë, 10, duke përdorur funksionin showcount() Meqenëse ekziston vetëm një kopje e numërimit, e ndarë nga objektet a dhe b, dalja është në të dyja rastet vlera është 10.

Është gjithashtu e mundur që të ketë funksione statike të anëtarëve. Funksionet e anëtarëve statikë nuk mund të referojnë drejtpërdrejt të dhënat jostatike ose funksionet jostatike të deklaruara në klasën e tyre. Arsyeja për këtë është se nuk ka këtë tregues për ta, kështu që nuk ka asnjë mënyrë për të ditur se me cilat të dhëna jostatike të punohet. Për shembull, nëse ka dy objekte të një klase që përmbajnë një funksion statik f(), dhe nëse f() përpiqet të aksesojë një ndryshore jostatike var të përcaktuar nga ajo klasë, si mund të përcaktohet se cila kopje e var duhet të përdoret ? Kompiluesi nuk mund ta zgjidhë një problem të tillë. Kjo është arsyeja pse funksionet statike mund të aksesojnë vetëm funksione të tjera statike ose të dhëna statike. Gjithashtu, funksionet statike nuk mund të jenë virtuale ose të deklaruara me modifikues konst ose të paqëndrueshëm. Një funksion statik mund të thirret ose duke përdorur një objekt të klasës ose duke përdorur emrin e klasës dhe një operator të fushës. Megjithatë, nuk duhet të harrojmë se edhe kur thirret një funksion statik duke përdorur një objekt, ai nuk kalohet te ky tregues.

Programi i shkurtër vijues ilustron një nga mënyrat e shumta për të përdorur funksionet statike. Një situatë mjaft e zakonshme është kur ju duhet të siguroni akses në një burim të kufizuar, siç është një skedar i përbashkët në një rrjet. Siç ilustron ky program, përdorimi i të dhënave dhe funksioneve statike ofron një metodë me të cilën një objekt mund të kontrollojë statusin e një burimi dhe t'i qaset atij nëse është e mundur.

#përfshi


qasja në klasë (
static enum access_t acs;
// ...
publike:


{
kthimi i acs;
}
// ...
};

int main()
{
aksesi obj1, obj2;
aksesi::set_akses (i kyçur); // telefononi duke përdorur emrin e klasës
// ... kodi

nëse (obj2.get_access()==i shkyçur) ( // thirrje duke përdorur objektin

cout<< "Access resource.\n";
}
tjetër cout<< "Locked out.\n";
// ...
kthimi 0;
}

Kur ekzekutoni këtë program, në ekran do të shfaqet "i bllokuar". Vini re se funksioni set_access() thirret me emrin e klasës dhe operatorin e fushës. Funksioni get_access() thirret me një objekt dhe me operatorin pikë. Kur thirrni një funksion statik, mund të përdoret njëra nga këto forma dhe të dyja kanë të njëjtin efekt. Ia vlen të eksperimentoni pak me këtë program për t'u siguruar që e kuptoni se si funksionon.

Siç u përmend, funksionet statike kanë qasje të drejtpërdrejtë vetëm në funksione të tjera statike ose të dhëna statike brenda së njëjtës klasë. Për ta kontrolluar këtë, le të përpiqemi të përpilojmë versionin e mëposhtëm të programit:

// ky program përmban një gabim dhe nuk do të përpilohet
#përfshi
enum access_t (i ndarë, në përdorim, i kyçur, i shkyçur);
// klasa kontrollon burimet e rralla
qasja në klasë (
static enum access_t acs;
int i; // jo statike
// ...
publike:
set_akses statik void (enum akses_t a) (acs = a;)
numri statik access_t get_access()
{
i = 100; // nuk do të përpilohet
kthimi i acs;
}
// ...
};
enum access_t akses::acs; // përkufizimi i acs
int main()
{
aksesi obj1, obj2;
aksesi::set_akses (i kyçur); // telefononi duke përdorur emrin e klasës
// ... kodi
// mund obj2 të hyjë në burim
if(obj2.get_access()==i shkyçur) ( // thirrje duke përdorur objektin
akses::set_akses(në_përdorim); // telefononi duke përdorur emrin e klasës
cout<< "Access resource.\n";
}
tjetër cout<< "Locked out.\n";
// ...
}

Ky program nuk do të kompilohet sepse funksioni get_access() po përpiqet të aksesojë një ndryshore jostatike.

Në fillim, mund të mos ndjeni nevojën urgjente për të përdorur anëtarë statikë, por ndërsa fitoni më shumë përvojë me programimin C++, ato bëhen shumë të dobishme në situata të caktuara, sepse shmangin përdorimin e variablave globalë.

Përditësimi i fundit: 10/08/2017

Përveç variablave dhe metodave që lidhen drejtpërdrejt me një objekt, C++ ju lejon të përcaktoni variabla dhe metoda që lidhen drejtpërdrejt me një klasë ose anëtarë të tjerë statikë të një klase. Variablat dhe metodat statike zbatohen për të gjithë klasën. Fjala kyçe statike përdoret për përcaktimin e tyre.

Për shembull, një bankë mund të ketë shumë depozita të ndryshme, por të gjitha depozitat do të kenë disa norma interesi të përbashkëta. Pra, për të përshkruar një llogari bankare, ne përcaktojmë dhe përdorim klasën e mëposhtme:

#përfshi Llogaria e klasës ( publike: Llogaria (shuma e dyfishtë) ( kjo-> shuma = shuma; ) statike int getRate() ( norma e kthimit; ) statike e pavlefshme setRate(int r) ( norma = r; ) dyfishtë getIncome() (shuma e kthimit + shuma * norma / 100 ) private: shuma e dyfishtë int; int Account::rate = 8; int main() ( Llogaria e llogarisë1(20000); Llogaria e llogarisë2(50000); Llogaria::setRate(5); // rivendosni vlerën e normës std::cout<< "Rate: " << Account::getRate() << std::endl; std::cout << "Rate: " << account1.getRate() << " Income: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.getRate() << " Income: " << account2.getIncome() << std::endl; return 0; }

Klasa Account përcakton një normë variabël statike dhe dy funksione statike për të kontrolluar këtë variabël. Gjatë përcaktimit të funksioneve statike, vlen të merret parasysh se brenda tyre mund të përdorim vetëm variabla të klasës statike, si p.sh. variabli rate. Ndryshoret jostatike nuk mund të përdoren në funksionet statike.

Përveç kësaj, nuk mund ta përdorni këtë tregues në funksionet statike, gjë që është e qartë në parim, pasi kjo tregon objektin aktual dhe funksionet statike i referohen të gjithë klasës.

Është gjithashtu e rëndësishme që nëse një klasë përmban variabla statike, atëherë ato duhet të përcaktohen shtesë jashtë klasës:

Llogaria Int:: norma = 8;

Caktimi i një vlere fillestare për një ndryshore është opsionale.

Vlen gjithashtu të theksohet se meqenëse anëtarët statikë i referohen të gjithë klasës, emri i klasës i ndjekur nga operatori :: përdoret për t'iu referuar anëtarëve statikë. Ose ne gjithashtu mund të aksesojmë anëtarët publikë të një klase përmes variablave të asaj klase:

Llogaria::getRate() account1.getRate()

Dalja e konsolës së programit:

Norma: 5 Norma: 5 Të ardhura: 21000 Norma: 5 Të ardhura: 52500

Është gjithashtu e zakonshme të përdoren konstante statike në klasa. Për shembull, le ta bëjmë variablin e normës në klasën e llogarisë një konstante:

#përfshi Llogaria e klasës ( public: konst static int rate = 8; Llogaria (shuma e dyfishtë) ( this->sum = sum; ) double getIncome() ( kthim shuma + shuma * norma / 100; ) private: shuma e dyfishtë; ); int main() ( Llogaria e llogarisë1(20000); Llogaria e llogarisë2(50000); std::cout<< "Rate: " << account1.rate << "\tIncome: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.rate << "\tIncome: " << account2.getIncome() << std::endl; return 0; }

Ndryshe nga variablat statike, konstantet statike nuk kanë nevojë të përcaktohen më tej jashtë klasës.

Shumica e fjalëve kyçe C++ bëjnë një gjë. Ju përdorni int për të deklaruar një ndryshore numër të plotë, ose kur një funksion kthen një vlerë të plotë ose merr një numër të plotë si argument. Ju përdorni operatorin e ri për të ndarë memorien dhe operatorin e fshirjes për ta liruar atë. Ju mund të përdorni const për të treguar se vlera e një ndryshore nuk mund të ndryshohet. Ironikisht, fjala kyçe statike, megjithëse do të thotë "e pandryshueshme", ka përdorime të shumta (dhe në dukje të palidhura). Fjala kyçe statike mund të përdoret në tre kontekste kryesore:

  • brenda një funksioni;
  • brenda një përkufizimi të klasës;
  • përpara një ndryshoreje globale brenda një skedari që përbën një program me shumë skedarë.

Përdorimi i statikës brenda një funksioni është më i thjeshtë. Kjo thjesht do të thotë që pasi të jetë inicializuar një variabël, ajo mbetet në memorie deri në fund të programit. Mund ta mendoni si një variabël që ruan vlerën e tij derisa programi të përfundojë. Për shembull, mund të përdorni një variabël statike për të regjistruar numrin e herëve të thirrur një funksion duke shtuar thjesht linjat static int count = 0; dhe numëro++; në një funksion. Meqenëse count është një variabël statike, linja static int count = 0; do të ekzekutohet vetëm një herë. Sa herë që thirret funksioni, count do të ketë vlerën e fundit që i jepet.

Ju gjithashtu mund të përdorni static në një mënyrë që parandalon riinitializimin e ndryshores brenda ciklit. Për shembull, në kodin e mëposhtëm, variabli numri_of_herëve do të jetë i barabartë me 100, edhe pse rreshti statik int numri_i_herëve = 0; ndodhet brenda një cikli, ku duket se ekzekutohet sa herë që programi arrin ciklin. Truku është se fjala kyçe statike parandalon që variabli të rifillohet. Një nga gjërat në lidhje me përdorimin e fjalës kyçe statike është se ajo vendos automatikisht variablin në null për ju - por mos u mbështetni në këtë (kjo i bën qëllimet tuaja të paqarta).

Për(int ix=0; ix< 10; ix++) { for(int iy = 0; iy < 10; iy++) { static int number_of_times = 0; number_of_times++; } }

Ju mund të përdorni variabla statike për të ruajtur informacionin rreth vlerës së fundit të kthyer nga një funksion, për shembull nëse dëshironi të ruani vlerën maksimale të llogaritur nga një funksion. Nëse po analizoni një varg, mund të ruani gjithashtu karakterin e fundit të kthyer nga funksioni në mënyrë që ta telefononi me një argument që tregon se duhet të kthejë karakterin e fundit.

Përdorimi i dytë i statikës është brenda një përkufizimi të klasës. Megjithëse shumica e variablave të deklaruar brenda një klase mund të kenë një vlerë të ndryshme në çdo instancë të klasës, fushat statike të një klase do të kenë të njëjtin kuptim për të gjitha instancat e një klase të caktuar dhe as nuk kanë nevojë të krijojnë një shembull të asaj klase. Është e dobishme të mendosh për variablat statike të klasës si që mbajnë informacionin e nevojshëm për të krijuar objekte të reja (për shembull, në një fabrikë të klasës). Për shembull, nëse doni të numëroni instancat e një klase, mund të përdorni një ndryshore statike për të mbajtur gjurmët e numrit të fundit të përdorur. Është e rëndësishme të theksohet se praktika e mirë kur përdoren variabla të klasës statike është përdorimi i emrit të klasës::x; , jo instance_of_class.x; . Kjo ndihmon për t'i kujtuar programuesit se variablat statike nuk i përkasin një shembulli të vetëm të një klase dhe se nuk keni nevojë të krijoni një shembull të asaj klase. Siç mund ta keni vënë re, ju mund të përdorni operatorin e fushës, ::, për të hyrë në statike kur e përdorni atë përmes emrit të klasës.

Është e rëndësishme të mbani në mend kur korrigjoni ose zbatoni një program duke përdorur static që nuk mund ta inicializoni brenda një klase. Në fakt, nëse vendosni të shkruani të gjithë kodin e klasës në një skedar header, nuk do të jeni në gjendje as të inicializoni një ndryshore statike brenda skedarit të kokës; bëjeni këtë në skedarin .cpp. Për më tepër, ju duhet të inicializoni anëtarët statikë të klasës, përndryshe ata nuk do të jenë në fushëveprim. (Sintaksa është pak e çuditshme: shkruani class_name::static_variable = vlera .)

Ju gjithashtu mund të keni funksione të klasës statike. Funksionet statike janë funksione që nuk kërkojnë një shembull të një klase dhe thirren në të njëjtën mënyrë, në analogji me variablat statike, me emrin e klasës dhe jo me emrin e objektit. Për shembull, a_class::static_function(); , jo an_instance.function(); . Funksionet statike mund të funksionojnë vetëm në anëtarët statikë të një klase, pasi ato nuk i referohen shembujve të veçantë të klasës. Funksionet statike mund të përdoren për të ndryshuar variablat statike, për të mbajtur gjurmët e vlerave të tyre - për shembull, mund të përdorni një funksion statik nëse vendosni të përdorni një numërues për t'i dhënë çdo shembulli të një klase një identifikues unik.

Për shembull, mund të përdorni kodin e mëposhtëm:

Përdoruesi i klasës ( private: int id; static int next_id; publik: static int next_user_id() ( next_id++; return_id_id; ) // metoda të tjera për përdoruesin e klasës së përdoruesit () // ndërtuesin e klasës ( id = përdorues::next_id++; / / ose thirrja e metodës, id = user.next_user_id(); int user::next_id = 0;

Vini re se duhet të përfshini llojin e ndryshores statike kur e vendosni!

Përdoruesi a_user;

do të vendosë ID-në në numrin tjetër ID që nuk përdoret nga asnjë objekt tjetër përdoruesi. Vini re se është një stil i mirë për të deklaruar një identifikues si një konstante.

Përdorimi i fundit i static është si një ndryshore globale në një skedar kodi. Në këtë rast, përdorimi i statikës tregon se kodi burim në skedarët e tjerë që janë pjesë e projektit nuk mund të aksesojë variablin. Vetëm kodi brenda të njëjtit skedar mund ta shohë variablin (fushëveprimi i tij është i kufizuar në skedar). Kjo teknikë mund të përdoret për të modeluar kodin e orientuar nga objekti sepse kufizon dukshmërinë e variablave dhe kështu ndihmon në shmangien e konflikteve të emërtimit. Kjo mënyrë e përdorimit të statikës është një relike e C.

Pastaj ne mund t'i qasemi direkt përmes emrit të klasës dhe operatorit të zgjidhjes së fushës. Por, çka nëse variablat e anëtarëve statikë janë privatë? Merrni parasysh kodin e mëposhtëm:

Në këtë rast, ne nuk mund të qasemi drejtpërdrejt në Anything::s_value nga main() pasi ky anëtar është privat. Në mënyrë tipike, anëtarët privatë të një klase aksesohen përmes metodave publike. Ndërsa ne mund të krijonim një metodë të rregullt për të hyrë në s_value, atëherë do të duhej të krijonim një objekt të asaj klase për të përdorur metodën! Ekziston një opsion më i mirë: ne mund ta bëjmë metodën statike.

Ngjashëm me variablat e anëtarëve statikë, metodat statike nuk janë të lidhura me asnjë objekt të një klase. Këtu është shembulli i mësipërm, por me një metodë statike:

class Anything ( private: static int s_value; public: static int getValue() ( return s_value; ) // metoda statike ); int Anything::s_value = 3; // përcaktimi i një ndryshoreje anëtare statike të klasës int main() ( std::cout<< Anything::getValue() << "\n"; }

Meqenëse metodat statike nuk janë të lidhura me një objekt specifik, ato mund të thirren drejtpërdrejt përmes emrit të klasës dhe operatorit të zgjidhjes së fushës, si dhe përmes objekteve të klasës (por kjo nuk rekomandohet).

Metodat statike nuk kanë një *ky tregues

Metodat statike kanë dy veçori interesante. Së pari, meqenëse metodat statike nuk janë të lidhura me një objekt, ato nuk kanë ! Kjo ka kuptim, pasi treguesi *this tregon gjithmonë objektin mbi të cilin vepron metoda. Metodat statike mund të mos funksionojnë përmes një objekti, kështu që treguesi *ky nuk është i nevojshëm.

Së dyti, metodat statike mund të aksesojnë drejtpërdrejt anëtarët e tjerë statikë (variabla ose funksione), por nuk mund të kenë akses në anëtarët jostatikë. Kjo ndodh sepse anëtarët jostatikë i përkasin objektit të klasës, por metodat statike jo!

Një shembull më shumë

Metodat statike mund të përcaktohen jashtë trupit të klasës. Kjo funksionon njësoj si me metodat e zakonshme. Për shembull:

#përfshi class IDGenerator ( private: static int s_nextID; // deklarimi i një variabli statik anëtar publik: static int getNextID(); // deklarimi i një metode statike); // Përkufizimi i një ndryshoreje anëtare statike është jashtë trupit të klasës. Ju lutemi vini re se ne nuk po përdorim fjalën kyçe statike këtu // Filloni të gjeneroni ID në 1 int IDGenerator::s_nextID = 1; // Përkufizimi i një metode statike është jashtë trupit të klasës. Ju lutemi vini re se ne nuk po përdorim fjalën kyçe statike këtu int IDGenerator::getNextID() ( return s_nextID++; ) int main() ( for (int count=0; count< 4; ++count) std::cout << "The next ID is: " << IDGenerator::getNextID() << "\n"; return 0; }

#përfshi

Klasa IDGenerator

private:

statike int s_nextID ; // deklarimi i një ndryshoreje anëtare statike

publike:

static int getNextID(); // deklarimi i një metode statike

// Filloni të gjeneroni ID nga 1

int IDGenerator::s_nextID = 1;

int IDGenerator::getNextID() (kthe s_nextID++;)

int main()

për (int count = 0 ; count< 4 ; ++ count )

std::cout<< "The next ID is: " << IDGenerator :: getNextID () << "\n" ;

kthimi 0;

Rezultati i ekzekutimit të programit të mësipërm:

ID-ja tjetër është: 1
ID-ja tjetër është: 2
ID-ja tjetër është: 3
ID-ja tjetër është: 4

Ju lutemi vini re se meqenëse të gjitha variablat dhe funksionet e kësaj klase janë statike, nuk kemi nevojë të krijojmë një objekt të kësaj klase për të punuar me të! Një variabël anëtar statik përdoret për të ruajtur vlerën e identifikuesit të ardhshëm që do t'i caktohet, dhe një metodë statike përdoret për të kthyer identifikuesin dhe për ta rritur atë.

Një paralajmërim për klasat me të gjithë anëtarët statikë

Kini kujdes kur shkruani klasa me të gjithë anëtarët statikë. Ndërsa të tilla "klasa thjesht statike" mund të jenë të dobishme, ato gjithashtu kanë të metat e tyre.

Së pari, duke qenë se të gjithë anëtarët statikë krijohen vetëm një herë, nuk mund të ketë kopje të shumta të një "klase thjesht statike" (pa klonuar klasën dhe më pas riemërimin e saj). Për shembull, nëse na duhen dy objekte të pavarura të klasës IDGenerator, atëherë kjo nuk do të jetë e mundur përmes një klase "thjesht statike".

C++ nuk suporton konstruktorë statikë

Nëse mund të inicializoni një variabël anëtar të rregullt nëpërmjet , atëherë logjikisht duhet të jeni në gjendje të inicializoni variablat e anëtarëve statikë nëpërmjet një konstruktori statik. Dhe ndërsa disa gjuhë moderne mbështesin konstruktorët statikë pikërisht për këtë qëllim, C++, për fat të keq, nuk është një prej tyre.

Nëse ndryshorja juaj statike mund të inicializohet drejtpërdrejt, atëherë nuk ka nevojë për një konstruktor: ju mund të përcaktoni një ndryshore anëtare statike edhe nëse është private. Këtë e bëjmë në shembullin e mësipërm me s_nextID. Ja një shembull tjetër:

klasa Diçka ( publike: statike std:: vektor s_mychars; ); std:: vektor Diçka::s_mychars = ( "o", "a", "u", "i", "e" ); // përcaktoni një variabël anëtar statik

klasë Diçka

publike:

statike std::vektor< char >s_mychars;

std:: vektor< char >Diçka :: s_mychars = ("o", "a", "u", "i", "e"); // përcaktoni një variabël anëtar statik

Nëse inicializimi i ndryshores suaj të anëtarit statik kërkon ekzekutimin e kodit (siç është një lak), atëherë ka disa mënyra të ndryshme për ta bërë atë. Metoda e mëposhtme është më e mira:

#përfshi #përfshi klasa Diçka ( private: static std::vector s_mychars; public: class _nested // përcaktoni një klasë të mbivendosur të quajtur _nested ( public: _nested() // konstruktori _nested inicializon variablin tonë statik të anëtarit ( s_mychars.push_back ("o"); s_mychars.push_back ("a"); s_mychars.push_back ("u" s_mychars.push_back("i"); // Metoda statike për nxjerrjen e s_mychars static void getSomething() ( for (auto const &element: s_mychars) std::cout<< element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vectorDiçka::s_mychars; // përkufizojmë variablin tonë statik të anëtarit Diçka::_neted Diçka::s_initializer; // përcaktoni s_initializer tonë statik, i cili do të thërrasë konstruktorin _nested për të inicializuar s_mychars int main() (Diçka::getSomething(); return 0; )

#përfshi

#përfshi

klasë Diçka

private:

statike std::vektor< char >s_mychars;

publike:

klasa_mbivendosur // përcaktoni një klasë të mbivendosur të quajtur _nested

publike:

i mbivendosur () // konstruktori _nested inicializon variablin tonë të anëtarit statik

s_mychars. push_mbrapa ("o");

s_mychars. push_mbrapa ("a");

s_mychars. push_mbrapa ("u");

s_mychars. push_mbrapa ("i");

s_mychars. push_mbrapa ("e");

Fjalë kyçe statike

Ndonjëherë ju duhet të përcaktoni një anëtar të një klase që do të përdoret në mënyrë të pavarur nga të gjitha objektet e tjera të kësaj klase. Në mënyrë tipike, qasja në një anëtar të klasës organizohet përmes një objekti të kësaj klase, por në të njëjtën kohë, ju mund të krijoni një anëtar të klasës për përdorim të pavarur pa iu referuar një shembulli specifik të objektit. Për të krijuar një anëtar të tillë të klasës, mjafton të tregohet që në fillim të deklarimit të tij fjalë kyçe statike.

Nëse një anëtar i klasës deklarohet si statik, atëherë ai bëhet i disponueshëm përpara se të krijohet ndonjë objekt i klasës së tij dhe pa referencë për ndonjë objekt. Ju mund të deklaroni si variablat ashtu edhe metodat duke përdorur fjalën kyçe statike. Shembulli më i zakonshëm i një anëtari statik është metoda Main(), e cila deklarohet si e tillë sepse duhet thirrur nga sistemi operativ që në fillim të programit ekzekutues.

Për të përdorur një anëtar të tipit static jashtë një klase, mjafton të specifikoni emrin e kësaj klase me operatorin pikë. Por ju nuk keni nevojë të krijoni një objekt për këtë. Në realitet, një anëtar i tipit static nuk është i aksesueshëm duke iu referuar një objekti, por nga emri i klasës së tij.

Variablat e deklaruar si statikë janë në thelb global. Kur objektet deklarohen në klasën e tyre, nuk krijohet një kopje e një ndryshoreje statike. Në vend të kësaj, të gjitha rastet e një klase ndajnë të njëjtën ndryshore statike. Një variabël i tillë inicializohet përpara se të përdoret në klasë.

Një shembull i përdorimit të fjalës kyçe statike:

Përdorimi i Sistemit; duke përdorur System.Collections.Generic; duke përdorur System.Linq; duke përdorur System.Text; namespace ConsoleApplication1 ( class myCircle ( // 2 metoda që kthejnë sipërfaqen dhe gjatësinë e një rrethi publik statik të dyfishtë SqrCircle(int radius) (kthim Math.PI * rreze * rreze; ) public static double LongCircle(int radius) ( return 2 * Math.PI * rreze; një rreth me rreze (0) = (1 :#.##)",r,myCircle.SqrCircle(r)); Console.WriteLine("Gjatësia e rrethit është (0:#.##)" ,myCircle.LongCircle(r));

Kufizimet e mëposhtme zbatohen për përdorimin e metodave statike:

    Një metodë e tipit statik nuk duhet të ketë një këtë referencë, pasi një metodë e tillë nuk ekzekutohet në lidhje me ndonjë objekt

    Një metodë e tipit static mund të quajë vetëm metoda të tjera të tipit static drejtpërdrejt, por jo një metodë shembulli nga e njëjta klasë. Çështja është se metodat e shembullit funksionojnë në objekte specifike dhe një metodë statike nuk thirret në një objekt. Rrjedhimisht, një metodë e tillë nuk ka objekte me të cilat mund të funksionojë.

    Kufizime të ngjashme vlejnë për të dhënat e tipit statik. Për një metodë të tipit static, vetëm të dhënat e tjera të tipit static të përcaktuara në klasën e saj janë drejtpërdrejt të aksesueshme. Në veçanti, ai nuk mund të operojë në një variabël shembulli të klasës së tij, pasi ai nuk ka objekte me të cilat mund të operonte

Konstruktorë statikë

Konstruktori gjithashtu mund të deklarohet statik. Një konstruktor statik zakonisht përdoret për të inicializuar komponentët që aplikohen për një klasë të tërë dhe jo për një shembull të vetëm të një objekti të asaj klase. Prandaj, anëtarët e klasës inicializohen nga një konstruktor statik përpara se të krijohet ndonjë objekt i asaj klase:

Përdorimi i Sistemit; duke përdorur System.Collections.Generic; duke përdorur System.Linq; duke përdorur System.Text; Hapësira e emrave ConsoleApplication1 ( klasa MyClass ( publike statike int a; publike int b; // Konstruktor statik statik MyClass() (a = 10; ) // Konstruktor i rregullt publik MyClass () ( b = 12; ) ) klasa Program ( zbrazëti statike kryesore (string args) ( Console.WriteLine ("Qasje në një shembull të klasës a: " + MyClass.a); MyClass obj = New MyClass(); Console.WriteLine ("Qasje në një shembull të klasës b: " + obj. b) Console .ReadLine();

Vini re se konstruktori i tipit statik thirret automatikisht kur klasa ngarkohet për herë të parë, përpara konstruktorit të shembullit. Një përfundim më i përgjithshëm nga kjo është se një konstruktor statik duhet të ekzekutohet përpara çdo konstruktori të shembullit. Për më tepër, konstruktorët statikë nuk kanë modifikues aksesi - ata kanë akses të paracaktuar dhe për këtë arsye nuk mund të thirren nga një program.

Klasat statike

Klasa mund të deklarohet si statike. Një klasë statike ka dy veti kryesore. Së pari, krijoni objekte të një klase statike është e ndaluar. Dhe së dyti, një klasë statike duhet të përmbajë vetëm anëtarë statikë. Një klasë statike krijohet duke përdorur formën e mëposhtme të deklarimit të klasës, e modifikuar duke përdorur fjalën kyçe statike.

Emri i klasës statike të klasës ( // ...

Klasat statike përdoren kryesisht në dy raste. Së pari, kërkohet një klasë statike gjatë krijimit metoda e zgjerimit. Metodat e zgjerimit lidhen kryesisht me gjuhën LINQ. Dhe së dyti, një klasë statike përdoret për të ruajtur një koleksion të metodave statike të lidhura me njëra-tjetrën.

 
Artikuj Nga tema:
Si të rivendosni të dhënat (rivendosja e vështirë, rivendosja e fabrikës) në Samsung Galaxy
Përshëndetje. Ka shumë situata ku një problem me softuerin në një pajisje celulare mund të zgjidhet vetëm duke kryer një rindezje të vështirë. Me fjalë të thjeshta, rivendosja e cilësimeve të Android në cilësimet e fabrikës herët a vonë mund të jetë e nevojshme për çdo vegël.
Mbajtëse për makinë për iPad mini Ipad mbajtëse makine blej
Në dyqane mund të gjeni një përzgjedhje të madhe të aksesorëve të tillë si një mbajtës iPad. Ata nuk janë të njëjtit lloj, por ndryshojnë si në teknologjinë e fiksimit ashtu edhe në metodën e instalimit të vetë tabletit. Në këtë material do të analizojmë shumë për iPad dhe montimin në makinë.
Hedh Sniper Elite V2 në desktop
Shumë lojtarë i duan projektet në zhanrin e gjuajtjes, ato ju lejojnë të testoni shpejtësinë e reagimit tuaj, si dhe të lehtësoni stresin pas një dite të vështirë. Megjithatë, menjëherë vlen të përmendet se ka drejtime të ndryshme të këtij zhanri, të cilat janë shumë të ndryshme nga njëra-tjetra.
Si të krijoni një video konferencë në Skype
Skype është një nga aplikacionet më të njohura për komunikim ndërmjet përdoruesve të internetit. Programi ju lejon të shkëmbeni mesazhe me tekst, si dhe të bëni thirrje audio dhe video. Skype u shfaq në 2003 dhe fitoi popullaritet të madh.