Besplatni Java kurs - 67. deo
Ovo je samo jedan od članaka koji zajedno čine besplatan Java tutorijal.
Java metode u istoj klasi mogu imati isto ime. U tom slučaju, govotimo o preopterećenju metoda (eng. method overloading).
Preopterećenje metoda - kada više metoda deli isto ime
Zamisli da si vlasnik jedne knjižare. Neko dođe i kaže ti: „Daj mi knjigu.” Ne znaš koju. Ali ako kaže: „Daj mi knjigu 'Dina'”, onda znaš, jer možeš da razumeš koju knjigu traže ako ti je poznat naslov. Ako kaže: „Daj mi knjigu čiji je kataloški broje 27”, opet znaš. Ista reč „daj”, ali različite informacije.
Ista priča važi i za Javu. Metode mogu imati isto ime, a različite parametre. To se zove preopterećenje metoda (method overloading). U ovom slučaju imaš dve verzije metode dajKnjigu, obe se zovu isto. Ali jedna metoda dajKnjigu ima int parametar, dok druga ima parametar tipa String.
Kôd bi mogao da izgleda ovako:
class Knjizara {
void dajKnjigu(String naslov) {
System.out.println("Izvoli, knjiga sa naslovom: " + naslov);
}
void dajKnjigu(int kataloskiBroj) {
System.out.println("Izvoli, knjiga sa kataloškim brojem: " + kataloskiBroj);
}
}
class Rad {
public static void main(String args[]) {
Knjizara mojaKnjizara = new Knjizara();
mojaKnjizara.dajKnjigu("Dina");
mojaKnjizara.dajKnjigu(27);
}
}
Šta se ovde dešava, korak po korak:
- Napravili smo klasu Knjižara sa dve metode, obe se zovu
dajKnjigu - Prva metoda prima
String(naslov knjige) - Druga metoda prima
int(kataloški broj) - U
mainmetodi pravimo objekatmojaKnjižara - Kada pozovemo
dajKnjigu("Dina"), Java razmišlja: „Stringje prosleđen kao parametar, zovem prvu metodu” - Kada pozovemo
dajKnjigu(27), Java razmišlja: „Parametar je tipaint, zovem drugu metodu”
Šta primećuješ?
Kao što vlasnik knjižare razume kupca na osnovu toga kakvu informaciju pruža (naslov ili kataloški broj), tako i Java razume koju metodu da pozove na osnovu tipa parametra koji se prosleđuje.
Ako obratiš pažnju, videćeš da u navedenom primeru preopterećene metode imaju isti broj parametara (jedan parametar) i parametri su različitog tipa. Preopterećene metode mogu imati i različit broj parametara.
Preopterećene metode sa različitim brojem parametara
Zamisli da pišeš program za jednu firmu. Treba da izračunaš koliko neko zarađuje. Ali zarada se može računati na više načina:
- na godišnjem nivou (ako znaš mesečnu platu)
- u različitim valutama (ako hoćeš da uporediš sa inostranstvom)
- za određeni broj dana (plata za 15 dana, za mesec dana, za 90 dana...)
Umesto da pišeš metode godisnjaPlata, plataUEvrima, plataZaPeriod, sve će se zvati zarada. Java će sama da prepozna koju metodu bi trebalo pa pozove na osnovu broja i tipa parametara.
Evo kako bi to moglo da izgleda:
class KalkulatorPlata {
float zarada(float mesecnaPlata) {
return mesecnaPlata * 12;
}
float zarada(float mesecnaPlata, String valuta) {
float godisnjaUDinarima = mesecnaPlata * 12;
if (valuta.equals("EUR")) {
return godisnjaUDinarima / 117; // kurs 1 EUR = 117 RSD (približno)
} else if (valuta.equals("USD")) {
return godisnjaUDinarima / 108; // kurs 1 USD = 108 RSD
} else {
return godisnjaUDinarima; // svaka druga valuta vraća u dinarima
}
}
float zarada(float mesecnaPlata, int brojDana) {
float dnevnica = mesecnaPlata / 30; // prosečan mesec ima 30 radnih dana? Zavisi od firme!
return dnevnica * brojDana;
}
}
class Rad {
public static void main(String args[]) {
KalkulatorPlata kp = new KalkulatorPlata();
System.out.println(kp.zarada(80000.00)); // Verzija 1 => 960000 (godišnje u RSD)
System.out.println(kp.zarada(80000.00, "EUR")); // Verzija 2 => ~8205 EUR godišnje
System.out.println(kp.zarada(80000.00, "USD")); // Verzija 2 => ~8888 USD godišnje
System.out.println(kp.zarada(80000.00, "CHF")); // Verzija 2 => 960000 (jer CHF nije EUR/USD)
System.out.println(kp.zarada(80000.00, 15)); // Verzija 3 => 40000 (plata za 15 dana)
System.out.println(kp.zarada(80000.00, 90)); // Verzija 3 => 240000 (plata za 90 dana)
}
}
Šta se ovde dešava?
Kada napišeš kp.zarada(80000.00), Java vidi: jedan float parametar. Poziva prvu verziju metode zarada.
U slučaju da napišeš kp.zarada(80000.00, "EUR"), Java vidi: float pa String. To ne može da bude prva verzija (ima samo float), niti treća (float pa int). Zato bira drugu verziju.
A kada napišeš kp.zarada(80000.00, 15), Java vidi: float pa int. To odgovara trećoj verziji.
Ista naziv metode - zarada - ali tri potpuno različita ponašanja. A ti kao programer ne moraš da pogađaš kako se koja metoda zove. Samo kažeš „izračunaj mi zaradu” i daš metodi ono što imaš pri ruci.
No comments:
Post a Comment