TOMÁŠ HUBÁLEK BLOG: BAVTE SE PŘIMĚŘENĚ…

Java: Předávání parametrů odkazem, nebo hodnotou?

Written By: Tomáš Hubálek - Nov• 20•04

JavaPředávání parametrů v Javě může začátečníkům činit občas potíže a tak bych chtěl ukázat dva příklady na toto téma…

Zkuste si přeložit a spustit následující příklad:

 /** Java: predavani parametru odkazem nebo hodnotou?  */ public class Main {     /** Hlavní methoda */     public static void main(String[] args) {         // ukazka pro pole          int array[] = { 0 };         System.out.println("array[0]=" + array[0]);         inc(array);         System.out.println("array[0]=" + array[0]);         // ukazka pro primitivni datovy typ         int i = 0;         System.out.println("i=" + i);         inc(i);         System.out.println("i=" + i);     }     /** Zvysi hodnotu prvniho prvku pole */     private static void inc (int[] array) {         array[0] ++;     }     /** Nezvysi (!) hodnotu parametru i      */     private static void inc (int i) {         i++;     } } 

Když program spustíte, vypíše vám následující:

 array[0]=0 array[0]=1 i=0 i=0 

Jak je vidět, když předáte jako parametr pole, jeho prvky mohou být modifikovány a když předáte primitivní datový typ, tak není modifikován. Nicméně pokud někde v nějakém testu narazíte na otázku, jestli Java předává parametry odkazem nebo hodnotou, správná odpověď je vždy “hodnotou”. Důkazem může být tento příklad:

 /** Dukaz ze se parametry nepredavaji odkazem, ale hodnotou */ public class ByReferenceOrByValue {   /** Hlavni metoda*/   public static void main(String[] args) {       Integer i = new Integer(1);       Integer j = new Integer(2);       System.out.println("i=" + i + ", j=" + j);       swap(i,j);       System.out.println("i=" + i + ", j=" + j);   }   /** Kdyby se predavalo odkazem, musela by fungovat tato    * metoda     */    public static void swap(Integer a, Integer b) {        Integer c = a;        a = b;        b = a;    }  } 

Tento program vypíše následující:

 i=1, j=2 i=1, j=2 

tedy, odkaz na proměnnou nebyl modifikován.

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

3 Comments

  1. Gingo says:

    Tvrzeni v zaveru neni pravda. Ano primitivni typy a jejich tridy se predavaji hodnotou, ale ostatni se predava odkazem.

  2. Tom says:

    [1] Já si ale stejně myslím, že mám pravdu.

    Pokud zmenim metodu swap a do signatury dam neco jineho nez Integer (napr. MyBean), tak to bude fungovat stejne.

  3. c++mastahhax0r says:

    Kdyby v riti byly ryby…. Bohuzel nas autor ne rozumi rozdil jaki je mezi pointer a reference, v JAVIE je to inak panacku…

Leave a Reply

Your email address will not be published. Required fields are marked *