Jelenlegi hely

11.6. A metódusok visszatérési értéke

A metódusok visszatérési értékének típusa a metódus deklarációjakor adható meg. A metóduson belül a return utasítással lehet a visszaadott értéket előállítani. A void-ként deklarált metódusok nem adnak vissza értéket, és nem kell, hogy tartalmazzanak return utasítást. Minden olyan metódus, amely nem void-ként lett deklarálva, kötelezően tartalmaz return utasítást. Sőt a fordító azt is kikényszeríti, hogy minden lehetséges végrehajtási ág return utasítással végződjön.

Tekintsük a következő isEmpty metódust a Stack osztályból:

public boolean isEmpty() {
    if (top == 0) {
        return true;
    } else {
        return false;
    }
}

A visszaadott érték adattípusa meg kell, hogy egyezzen a metódus deklarált visszatérési értékével; ezért nem lehetséges egész számot visszaadni olyan metódusból, aminek logikai a visszatérési értéktípusa. A fenti isEmpty metódus deklarált visszatérési érték típusa logikai (boolean), és a metódus megvalósítása szerint igaz (true), vagy hamis (false) logikai érték kerül visszaadásra a teszt eredményének megfelelően.

Megjegyzés: A fenti kód helyett általában tömörebb írásmódot szokás alkalmazni. Ennek ellenére ebben a jegyzetben a jobb érthetőség kedvéért időnként a hosszabb formát alkalmazzuk. A következő kód az előzővel teljesen ekvivalens:

public boolean isEmpty() {
    return top == 0;
}

Az isEmpty metódus elemi (vagy primitív) típust ad vissza. Egy metódus referencia adattípust is visszaadhat. Például ha a Stack osztály definiálja a pop metódust, amely az Object referencia adattípust adja vissza:

public Object pop() {
    if (top == 0) {
        throw new EmptyStackException();
    }
    Object obj = items[--top];
    items[top] = null;
    return obj;
}

Amikor egy metódus visszatérési típusa egy osztály, (mint ahogy a fenti pop esetén), a visszaadott objektum típusa meg kell, hogy egyezzen a visszatérési típussal, vagy leszármazottja kell, hogy legyen annak. Tegyük fel, hogy van egy olyan osztályhierarchia, amelyben ImaginaryNumber a java.lang.Number leszármazott osztálya, ami viszont az Object leszármazott osztálya. Ezt mutatja az alábbi ábra:

Ezek után tegyük fel, hogy egy metódus úgy kerül deklarálásra, hogy egy Number-t ad vissza:

public Number returnANumber() {
    ...
}

A returnANumber metódus visszaadhat egy ImaginaryNumber típust, de nem adhat vissza Object típust. ImaginaryNumber egy Number, mivel a Number leszármazott osztálya. Ugyanakkor az Object nem feltétlenül Number is egyben, – lehet akár String, vagy akár egész más típusú is.

Interfész neveket is lehet visszatérési típusként használni. Ebben az esetben a visszaadott objektumnak a megadott interfészt (vagy leszármazottját) kell implementálnia.