17.10. (2) Ključna reč static i prenos parametara
U C# svaka metoda pripada nekoj klasi.
Metoda može biti instancijska (poziva se preko objekta) ili statička (poziva se direktno preko klase).
🔹 Ključna reč static
Metoda ili promenljiva označena sa static ne pripada instanci (objektu), već samoj klasi.
Primer u konzolnoj aplikaciji:
class Matematika
{
public static double Kvadrat(double x)
{
return x * x;
}
}
// poziv:
double rezultat = Matematika.Kvadrat(5);
Primer u vizuelnoj aplikaciji:
Kreirati winForm aplikaciju u kojoj je jedna forma i na njoj dve labele i dva dugmeta. Pre konstruktora postaviti dve promenljive, od kojih je jedna statička:
int broj;
static int brojs;
Jedno dugme služi za povećanje vrednosti promenljivih za 1 i prikaz vrednosti u labelama na formi:
broj++;
brojs++;
label1.Text = broj.ToString();
label2.Text = brojs.ToString();
Drugo dugme služi za kreiranje nove forme:
Form1 f = new Form1();
f.Show();
Prilikom pokretanja programa treba 5 puta kliknuti na dugme za povećanje vrednosti promenljivh. Zatim kliknuti na dugme kojim se kreira nova forme. Koje vrednosti su prikazane u labelama?
Nakon toga još 5 puta kliknuti na dugme za uvećanje vrednosti promenljivih na drugoj formi - pratite koje su vrednosti promenljivih...
Koje vrednosti promenljivih će biti prikazane ako se kreira još jedna forma?
Ceo projekat sa časa: AppZaPrimenuStatickihElemenata.7z
Prednost korišćenja statičkih članova je da nema potrebe za kreiranjem objekta.
Ograničenje je u tome što statičke metode ne mogu pristupati nestatičkim članovima.
Ako je potrebno definisati član klase koji se koristi nezavisno od objekta treba ga označiti kao static.
Primer statičke metode je metoda main() - koristimo je bez formiranih objekata !
Metoda main() se poziva pre pravljenja bilo kakvog objekta !
Sve instance neke klase dele ISTU statičku promenljivu.
U nekim knjigama o C#-u naići ćete na ograničenja kao što su:
- Statične metode mogu pozivati SAMO statične metode direktno ( Ipak, možete pozvati i nestatičnu metodu, ali ako je ona u nekom konkretnom objektu ! )
- Statične metode moraju pristupati SAMO statičnim podacima ( ovde možete da koristite podatke koje ste uneli kao konstante)
- NE MOGU se koristiti rezervisane reči this i super (o ovome će biti reči u narednom gradivu)
Možete da to shvatite i ovako:
U C# (i u Javi) ne postoje globalne promjenljive ni funkcije koje nisu metodi neke klase, nego se umesto njih koriste static atributi i metodi. Dakle, static atribut možete posmatrati kao globalnu promenljivu, s tim da joj pristupte sa Klasa.Atribut. Slično važi i za static metod. Static konstruktor služi za inicijalizaciju static atributa neke klase, dok obični konstruktor inicijalizuje non-static, tako da nema preklapanja.
2. Prenos parametara po vrednosti i po referenci
🔸 Po vrednosti
Kada se argument prosledi po vrednosti, metoda dobija kopiju promenljive.
void Povecaj(int x)
{
x++;
}
int a = 5;
Povecaj(a);
Console.WriteLine(a); // ispisuje 5
🔸 Po referenci
Ako se argument prosledi po referenci (ref), metoda radi sa originalnom promenljivom.
void PovecajRef(ref int x)
{
x++;
}
int b = 5;
PovecajRef(ref b);
Console.WriteLine(b); // ispisuje 6
Upotreba
refje korisna kada želimo da metoda direktno menja vrednost promenljive iz glavnog programa.
3. Vežbe
Vežba 1:
Napisati statičku metodu Zameni(ref int a,
ref int b) koja zamenjuje vrednosti dve promenljive.
static void Zameni(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
Vežba 2:
Napisati statičku metodu Kvadriraj(ref int
broj) koja vraća kvadrat broja, ali kroz referencu menja originalnu vrednost.
static void Kvadriraj(ref int broj)
{
broj = broj * broj;
}
4. Zadatak za kraj časa
Napisati klasu MatOperacije sa statičkim metodama:
-
Saberi(int a, int b) -
Oduzmi(int a, int b) -
Zameni(ref int a, ref int b)
Pozvati sve metode iz Main() i prikazati rezultate.