Jelenlegi hely

11.5. Információátadás metódus vagy konstruktor számára

A metódus vagy konstruktor deklaráció megmutatja a paraméterek számát és típusát. Például a következő metódus kiszámolja a kölcsön havi törlesztő részleteit:

public double computePayment(double loanAmt, double rate,
                             double futureValue,
                             int numPeriods) {
    double I, partial1, denominator, answer;
    I = rate / 100.0;
    partial1 = Math.pow((1 + I), (0.0 - numPeriods));
    denominator = (1 - partial1) / I;
    answer = ((-1 * loanAmt) / denominator)
               - ((futureValue * partial1) / denominator);
    return answer;
}

Ebben a metódusnak négy paramétere van: a kölcsön összege, kamata, végösszege, fizetés gyakorisága. Az első három dupla pontosságú lebegő pontos szám, míg a negyedik egész szám.

Ahogy ennél a metódusnál is látható, a metódus vagy konstruktor paraméterlistája változó deklarációk vesszővel elválasztott listája, ahol minden változó deklaráció típus-név párokkal van megadva. Amint láthatjuk a computePayment metódus törzsében a paraméternevekkel egyszerűen hivatkozunk az értékükre.

Paraméterek típusa

A metódusok vagy konstruktorok paraméterei típussal rendelkeznek. A típus lehet primitív (int, float, stb.), amint láthattuk a computePayment metódusnál, vagy referencia típusú (osztályok, tömbök esetén). A következő metódus egy tömböt lap paraméterként, majd létrehoz egy új Polygon objektumot, és inicializálja a Point objektumok tömbjéből. (Feltételezzük, hogy a Point egy osztály, amelyik x, y koordinátákat tartalmaz.)

public static Polygon polygonFrom (Point[] listOfPoints) {
    ...
}

A Java nyelv nem engedi, hogy metódust egy másik metóduson belül helyezzünk el.

Paraméter nevek

Amikor metódusban vagy konstruktorban paramétert deklarálunk, eldönthetjük, hogy milyen nevet adunk a paraméternek. Ezt a nevet használhatjuk a metódus törzsében a paraméter értékek elérésére.
A paraméter nevének egyedinek kell lennie a hatáskörén belül. Vagyis nem lehet ugyanaz, mint egy másik paraméter, vagy lokális változó vagy bármely paraméter neve egy catch záradékban ugyanazon a metóduson vagy konstruktoron belül. Lehet viszont ugyanaz a név, mint az osztály egy tagváltozója. Ebben az esetben, azt mondjuk, hogy a paraméter elfedi a tagváltozót. Ilyen elfedett tagváltozót is el lehet érni, bár kicsit körülményes. Például nézzük meg a következő Circle osztályt és a setOrigin metódust:

public class Circle {
    private int x, y, radius;
    public void setOrigin(int x, int y) {
        ...
    }
}

A Circle osztálynak három tagváltozója van: x, y és radius. A setOrigin metódus két paramétert vár, mindkettőnek ugyanaz a neve, mint a tagváltozónak. A metódus mindkét paramétere elrejti az azonos nevű tagváltozót. Ha a metódus törzsében használjuk az x vagy y nevet, akkor a paraméterekre és nem a tagváltozókra hivatkozunk. A tagváltozó eléréséhez minősített nevet kell használni, amiről később olvashat.

Paraméter-átadás érték szerint

A paraméter-átadás érték szerint történik. Amikor meghívunk egy metódust vagy egy konstruktort, akkor a metódus megkapja az érték másolatát. Amikor a paraméter referencia típusú, akkor a referencián keresztül ugyanazt az objektumot érhetjük el, mivel csak a referencia értéke másolódott át: meghívhatjuk az objektumok metódusait és módosíthatjuk az objektum publikus változóit.

Nézzük meg a következő getRGBColor metódust, amelyik megkísérli visszaadni a paraméterein keresztül a tagváltozói értékeit:

public class Pen {
    private int redValue, greenValue, blueValue;
    ...
    public void getRGBColor(int red, int green, int blue) {
        red = redValue;
        green = greenValue;
        blue = blueValue;
    }
}

Ez így nem működik. A red, green és blue változó létezik ugyan, de a hatásköre a getRGBColor metóduson belül van. Amikor a metódusból visszatér a program, ezek a változók megszűnnek.

Írjuk újra a getRGBColor metódust, hogy az történjen, amit szerettünk volna. Először is, kell egy új RGBColor típus, hogy megőrizze a red, green és blue színek értékét:

public class RGBColor {
    public int red, green, blue;
}

Most már átírhatjuk a getRGBColor metódust, hogy paraméterként RGBColor objektumot várjon. A getRGBColor metódus visszatér az aktuális toll színével a beállított red, green és blue tagváltozó értékével az RGBColor paraméter segítségével:

public class Pen {
    private int redValue, greenValue, blueValue;
    ...
    public void getRGBColor(RGBColor aColor) {
        aColor.red = redValue;
        aColor.green = greenValue;
        aColor.blue = blueValue;
    }
}

Az így visszaadott RBColor objektum a getRGBColor metóduson kívül is megtartja értékét, mivel az aColor egy objektumra hivatkozik, amely a metódus hatáskörén kívül létezik.

Megjegyzés: Természetesen az is egy – bizonyos értelemben egyszerűbb – megoldás lehetett volna, hogy a három érték lekérdezéséhez három lekérdező metódust készítünk. Így nem lett volna szükség egy új típus bevezetésére. E megoldás a következő pont elolvasása után el is készíthető.