Funktion arvo palautetaan return - lauseessa. Jokaisessa ei- void - tyyppiseksi esitellyssä funktiossa tulee olla vähintään yksi return - lause. void- tyyppisessäkin voi olla return- lause. Tarvittaessa return- lauseita voi olla useampiakin:
public static int suurempi(int a, int b) { if ( a >= b ) return a; return b; }
Kun return - lause tulee vastaan, lopetetaan HETI funktion suoritus. Tällöin myöhemmin olevilla lauseilla ei ole mitään merkitystä. Näin ollen useat return- lauseet ovat mielekkäitä vain ehdollisissa rakenteissa. Siis seuraavassa ei olisi mitään mieltä:
public static int hopo(int a) :-( { int i; return 5; /* Palauttaa aina 5!!! */ i = 3 + a; return i+2; }
return- lausetta ei saa sotkea siihen, että parametrina vietyjä olioita voidaan pyytää muuttamaan sisältöään funktion aikana:
/** * Esimerkki funktiosta joka muuttaa myös parametriään * @author Vesa Lappalainen * @version 1.0 / 05.01.2003 */ public class FunJaOlio { private static int pituus_ja_muuta(StringBuffer s) { int pit = s.length(); s.delete(0,pit).append("toka"); // pääohjelman jono muuttuu nyt return pit; } public static void main(String[] args) { int i; StringBuffer jono = new StringBuffer("eka"); i = pituus_ja_muuta(jono); System.out.println("i=" + i + ", jono="+jono); // tulostaa: i=3, jono=toka } }
Edellä ei kutsusta näe millään tavalla että kutsun jälkeen jono on muuttunut. Yhtenä Java-kielen miinuksena voidaankin pitää sitä, että siitä puuttuu C++-kielessä oleva mekanismi suojata oliot muutoksilta aliohjelman suorituksen aikana ( const).
Näin paljon jääkin ohjelmoijan vastuulle, eli ohjelmoijan pitää nimetä aliohjelmat siten, että niiden nimi jo paljastaa jos jotakin parametria muutetaan ohjelman suorituksen aikana. Ja sitten aliohjelmat on tehtävä huolellisesti, etteivät ne todellakaan muuta kutsuparametrejaan jollei se ole aliohjelmien tarkoitus.
private static int pituus_ja_muuta(StringBuffer s) { s.append("toka"); return s.length(); }