Zajednički članovi klase
- static -
Osnovni pojmovi:- Pri kreiranju objekata klase, za svaki objekat se kreira poseban komplet podataka članova
- Podatak član može biti deklarisan kao statički pomoću specifikatora static ispred tipa.
- Postoji samo jedan
primerak statičkog podatka člana za celu klasu (zajednički podatak
za sve objekte klase).
- Statička polja su nezavisna od objekata te klase, tj. isti su za sve objekte.
- Statički član klase ima životni vek kao i globalni statički objekat: nastaje na početku i traje do kraja programa.
- Statički članovi
se uglavnom koriste kada svi primerci jedne klase treba da dele neku
zajedničku informaciju.
- Bez obzira na broj objekata klase koja sadrži atribut static, postoji tačno jedna kopija tog polja u aplikaciji.
- Statičku promenljivu nazivamo deljenim poljem – to je polje koje dele svi objekti, umesto da takvo polje postoji u svakom objektu.
- Statičkim članovima pristupamo preko imena klase.
- Da bismo ih koristili, ne treba da kreiramo objekat.
- Nestatička polja su mnogo češća od statičkih.
Malo detaljnije objašnjenje:
Ključna reč static
U C#, "static" znači "odnosi se na sam tip, a ne na instancu tipa". Pristupate statičkim članovima tako što koristite ime tipa, a ne adresu ili vrednost.
Kao što smo videli u prethodnom gradivu, uobičajeni način komuniciranja sa klasom je stvaranje nove instance klase (objekta), a zatim rad sa objektom. U većini slučajeva, to je ono što radimo na časovima: koristimo mogućnost pravljenja više različitih objekata iste klase i zatim ih drugačije koristimo na neki način.
Međutim, u nekim slučajevima nam treba da imamo klasu koju možemo koristiti bez instanciranja ili barem klasu u kojoj možemo koristiti neke članove, ali bez stvaranja objekta. Na primer, možemo imati klasu sa promenljivom koja uvek ostaje ista bez obzira gde i kako se koristi. Takav element se naziva statički element klase, baš zato što ostaje isti.
Klasa može biti statička i može imati statičke članove u sebi: i funkcije i polja. Statička klasa se ne može instancirati, dakle drugim rečima, ona će raditi više kao grupisanje povezanih članova nego kao stvarna klasa. Možete umesto toga stvoriti nestatičku klasu, ali koja ima neke statičke članove. Nestatička klasa i dalje se može instancirati i koristiti kao uobičajena klasa, ali ne možete koristiti statički član pomoću objekta klase.
Statička klasa može sadržati samo statičke članove.
Kao prvo, u nastavku je primer statičke klase:
public static class Rectangle
{
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Kao što možete da vidite, koristimo ključnu reš static da bismo obeležili klasu kao statičku, a zatim istu ključnu reč static koristimo da označimo statički metod: CalculateArea. Ako to ne bi uradili, kompajler bi se pobunio, s obzirom da ne možemo da imamo nestatičke članove u statičkoj klasi. Da bi koristili ovaj metod, pozivamo ga direktno preko naziva klase, kao na primer ovo:
Console.WriteLine("povrsina je: " + Rectangle.CalculateArea(5, 4));
Možemo da dodamo i još neke metode u klasu Rectangle, ali se možda pitate zašto prosleđujemo širinu i visinu u metod, umesto da ga sačuvamo unutar klase u nekoj promenljivoj, a onda da ih koristimo po potrebi? Baš zato što su statički! Možemo i da ih sačuvamo, ali samo jedan skup dimenzija, a to je zato postoji samo jedna verzija statičke klase. Veoma je važno da to razumete. Umesto ovoga, možemo da napravimo klasu koja nije statička, a onda da unutar nje napravimo CalculateArea kao uslužnu funkciju u toj klasi:
public class Rectangle
{
private int width, height;
public Rectangle(int width, int height)
{
this.width = width;
this.height = height;
}
public void OutputArea()
{
Console.WriteLine("Area output: " + Rectangle.CalculateArea(this.width, this.height));
}
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Ko što možete da vidite, napravili smo klasu koja nije statička. Takođe smo dodali konstruktor, koji kao parametar uzima širinu i visinu i dodeljuje ih instanci (konkretnom objektu koji se napravi). Zatim smo dodali metod OutputArea, koji koristi statički metod da bi izračunao površinu. Ovo je dobar primer mešanja statičkih i nestatičkih članova, i to u nestatičkoj klasi. Uobičajeno je da se statičke klase koriste kao uslužne(/helper) klase, gde je na jednoj gomili hrpa korisnih metoda, kojima možda i nije mesto zajedno.
Drugi primer koji viđate na vežbama na svakom času:
Unutar klase Program imamo statičku funkciju Main, koja je samo jedna za program, i odatle kreće rad ...
Sledeći primer je klasa Math u kojoj se na gomili nalazi dosta funkcija za matematičke op'eracije - sigurno nećete praviti objekat od klase Math ....
... ili ako koristite nešto kao : Array.Sort(nazivNiza) - za sortiranje niza ....