Obsah

Předávání parametrů

Viz též heslo Parametr na Wikipedii.

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ů. formální a skutečné parametry 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.

předávání parametrů

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.