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.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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:

Mindemellett fontos kihangsúlyozni a következőket:

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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!

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

Ugye hogy a túlterhelésnek semmi köze a túlterheléshez?