V této kapitole se budeme věnovat parametrům metod. Parametry
uvedené v deklaraci metody se nazývají
formální parametry
(angl. parameters). Formální parametry
jsou lokální proměnné, které jsou inicializovány na hodnoty
tzv. skutečných parametrů.
Skutečné parametry (argumenty,
angl. arguments) zadáváme při volání
metody. Volání metody lze rozdělit do několika kroků:
1) na zásobníku se vytvoří rámec pro volanou metodu. Rámec obsahuje
místo pro lokální proměnné dané metody a operandový zásobník.
Mezi lokálními proměnnými jsou i formální parametry.
2) Formální parametry se inicializují hodnotami skutečných
parametrů. 3) Provede se tělo metody. 4) Při ukončení metody se
zruší rámec alokovaný při vstupu do této metody a provede se návrat
do místa volání. Po návratu z metody je zásobník ve stejném stavu
jako před voláním. Následující obrázek ukazuje stavy zásobníku
v několika místech programu. V bodě 1 je v zásobníku pouze
proměnná y, která je lokální v metodě
main. V bodě 2, tj. na začátku metody
m, je v zásobníku kromě proměnné
y také proměnná
x, která je lokální v metodě
m. Proměnná x
je inicializována na hodnotu skutečného parametru zadaného při
volání, tj. na hodnotu proměnné y.
Při přechodu z bodu 2 do bodu 3 došlo ke změně hodnoty proměnné
x. V bodě 3 má proměnná
x hodnotu 2. V bodě 4, po návratu
z metody m, je zásobník ve stejném stavu
jako v bodě 1.
Formální parametry jsou lokální v dané metodě. Změna jejich hodnoty
se tedy mimo metodu neprojeví.
static void prictiDve( int x ) {
x += 2;
}
public static void main( String[] args ) {
int y = 0;
prictiDve( y );
System.out.println( y ); // vypíše 0
}
Do metody prictiDve se předá pouze
hodnota proměnné y (její hodnota se při
volání zkopíruje do proměnné x).
Proto nelze proměnnou y v metodě
prictiDve změnit. Tento způsob předávání
parametrů se nazývá předávání hodnotou.
V Javě se všechny parametry předávají hodnotou.
Chceme-li nějakou hodnotu předat ven z metody, musíme ji vrátit jako
návratovou hodnotu. Při volání metody návratovou hodnotu převezmeme
a např. uložíme do proměnné.
static int vynasob( int x, int y ) {
return x * y;
}
public static void main( String[] args ) {
int a = 2, b = 3;
a = vynasob( a, b );
System.out.println( a );
}
Převzetí návratové hodnoty není povinné. Pokud návratovou hodnotu
nepotřebujeme, můžeme metodu volat, jako kdyby byla typu
void.
static double vytiskniAVrat( double d ) {
System.out.println( d );
return d;
}
public static void main( String[] args ) {
vytiskniAVrat( Math.E ); // návratovou hodnotu ignorujeme
}
Úloha 1
Doplňte volání metody prictiTretinu.
Otázky a odpovědi
Student:
Mistře, v jakém pořadí se vyhodnocují skutečné parametry při
volání metody? Lze se na pořadí vyhodnocování spolehnout?
Java guru:
Ano, v Javě je definováno i pořadí vyhodnocování skutečných
parametrů. Vyhodnocují se vždy zleva doprava.
public static void main( String[] args ) {
int x = 0;
vypis( x++, x );
}
static void vypis( int a, int b ) {
System.out.printf( "[%d, %d]%n", a, b );
}
Při volání metody vypis se tedy
nejprve vyhodnotí výraz x++, jehož
hodnotou je 0. Vedlejším efektem vyhodnocení je zvýšení
hodnoty x o jedničku. Poté se
vyhodnotí výraz x, jehož hodnotou
je 1. Metoda vypis je tedy volána
s parametry 0 a 1.