Gyakorlati alapok II.
Ahol az elnevezésnek köze nincs a tartalomhoz:
a metódus-túlterhelés
A metódus-túlterhelés eredeti angol neve method overloading, amelynek tükörfordítása a túlterhelés szó. Egyszerű és praktikus programozás-technikai lehetőségről van szó, amire a JVM okosan fel lett készítve, de véleményem szerint magának az elnevezésnek semelyik nyelven sincs sok köze magához a funkcióhoz.
Lehetőségünk van a Java nyelven belül arra, hogy egy metódusnevet többször is felhasználjunk. Egy metódust ugyanis nemcsak a neve azonosít be kizárólagosan, hanem egyéb deklarált jellemzői is, főként bemeneti paramétereinek típusa és száma. Egyes szakkönyvek ezt az összetett azonosítási arculatot a metódusok szignatúrájának nevezik.
Már fuldoklunk is a metódus-túlterhelés általános meghatározásának érthetetlenségétől, ezért rögtön ugorjuk bele egy konkrét példába!
Adott 4 db muvelet nevű metódus + 1 kötelező main(). Láthatóan a 4 db muvelet nevű metódus nevében azonos, azonban bemeneti paramétereikben és kimeneti jellemzőikben különbözőek. Ha a metódushívások paraméterei pontosan vannak megadva (és túlterhelés esetén valójában csakis erre kell ügyelnünk fokozottan), akkor ez alapján képes a JVM kiválasztani a megfelelő metódust. Az érthetőség kedvéért készítsünk egy gyors listát a metódusokról:
-
int muvelet(int a, int b, int c) - összeadja az a b c számokat,
-
int muvelet(int a) - hatványozza a számot,
-
double muvelet(double a, double b) - elosztja a számot b számmal,
-
void muvelet() - meghívja a fenti 3 metódust és kiírja végeredményüket.
Mindemellett fontos kihangsúlyozni a következőket:
a szignatúra kiértékelésébe nem tartozik bele a metódus kimeneti típusa!
Például a következő deklaráció esetén...
static int muvelet(int a){
return a * a;
}
static int muvelet(int a){
return a + a;
}
...fordítási hibaüzenetet fogunk kapni.
Nézzük meg a futtatható Java-kódot!
public class Main {
static int muvelet(int a, int b, int c){
return a + b + c;
}
static int muvelet(int a){
return a * a;
}
static double muvelet(double a, double b){
return a / b;
}
static void muvelet(){
System.out.println(muvelet(1,2,3));
System.out.println(muvelet(2));
System.out.println(muvelet(6,2));
}
public static void main(String[] args) {
muvelet();
}
}
Végeredmény:
6
4
3.0
A metódus-túlterhelés további vizsgálatára nagyon praktikus, ha vetünk néhány rövid pillantást az API (A Java-nyelv rövid története és komponensei című fejezet) által felkínált óriás terjedelmű, előregyártott függvénykönyvtárába. Ha például projektünkbe a matematikai rutinok gyűjteményét importáljuk be (import.java.math.*) akkor rengeteg matematikai függvényhez férhetünk hozzá, közöttük sok túlterhelt lesz. Ilyen például az abszolútérték függvénye (Bach és -10, mint abszolút értékek (|Bach|, |10|) című fejezet), amelyet a Java fejlesztői megírtak (túlterheltek) az összes egyszerű numerikus adattípusra:
-
Math.abs(int a)
-
Math.abs(long a)
-
Math.abs(float a)
-
Math.abs(double a)
Ugye hogy a túlterhelésnek semmi köze a túlterheléshez?