Př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.
Tvrzeni v zaveru neni pravda. Ano primitivni typy a jejich tridy se predavaji hodnotou, ale ostatni se predava odkazem.
[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.
Kdyby v riti byly ryby…. Bohuzel nas autor ne rozumi rozdil jaki je mezi pointer a reference, v JAVIE je to inak panacku…