Java je předávána podle hodnoty, nikoli podle reference

V programovacím jazyce Java se při předávání argumentů funkcím a metodám uplatňuje princip nazývaný „předávání podle hodnoty“. To znamená, že při předání proměnné se do dané funkce nekopíruje přímý odkaz (reference) na původní objekt, nýbrž kopie jeho aktuální hodnoty. Tento jemný, ale zásadní rozdíl je nezbytný pro správné pochopení fungování Javy a může být na první pohled neintuitivní, zejména pro programátory, kteří mají zkušenosti s jazyky jako C++, kde se běžně pracuje s předáváním odkazem.

Jak to vypadá v praktickém kódu?

Zvažte situaci, kdy máte proměnnou typu Integer, která má hodnotu 5, a tuto proměnnou předáváte funkci, která by ji měla změnit na 10. V Javě se v tomto případě původní hodnota této proměnné nezmění. Funkce totiž dostane pouze kopii hodnoty 5, kterou sice může upravit na 10, ale tato úprava nebude mít žádný vliv na původní proměnnou.


public static void main(String[] args) {
    Integer number = 5;
    changeValue(number);
    System.out.println("Hodnota po funkci: " + number); // Vypíše 5, jelikož původní proměnná se nezměnila
}

public static void changeValue(Integer value) {
    value = 10;
}

Rozdíly mezi datovými typy

Je klíčové si uvědomit, že předávání podle hodnoty se vztahuje na primitivní datové typy (int, char, boolean, float, double, byte a short), které jsou ukládány přímo v paměti. U referenčních typů, jako jsou objekty (instance tříd), se předává kopie reference. To v praxi znamená, že obě proměnné (původní i ta uvnitř funkce) budou směřovat na stejné místo v paměti, kde je uložen daný objekt.


public static void main(String[] args) {
    String text = "Ahoj";
    changeText(text);
    System.out.println("Text po funkci: " + text); // Vypíše "Ahoj", změna se neprojeví na původním objektu
}

public static void changeText(String text) {
    text = "Svět";
}

V tomto příkladu se kopie reference na původní objekt „text“ předá do funkce changeText. Nicméně, uvnitř funkce je vytvořen nový objekt „Svět“, ke kterému je přiřazena lokální proměnná `text`. Původní proměnná `text` v main zůstává nezměněna, protože ukazuje na původní objekt „Ahoj“. Změna hodnoty proběhla pouze v lokálním scope funkce.

Klíčové aspekty předávání podle hodnoty

  • Ochrana dat: Předávání hodnotou brání nechtěné modifikaci původních dat.
  • Efektivita: Kopírování hodnot je rychlé a efektivní, zejména u primitivních datových typů.
  • Jasnost: Název proměnné v rámci funkce je lokální a nijak neovlivňuje název proměnné v hlavním programu.

Další důležité koncepty

  • Úprava obsahu objektu: I když se u referenčních typů předává kopie reference, je možné měnit obsah objektu, na který tato reference ukazuje.
  • Třída StringBuilder: Třída StringBuilder umožňuje upravovat obsah řetězce bez nutnosti vytvářet nový objekt, což zvyšuje efektivitu práce s textem.
  • Konstruktory: Konstruktory slouží k inicializaci objektů a **nekopírují hodnoty**. Místo toho vytváří nový objekt na novém místě v paměti.

Závěr: Základní znalost pro efektivní vývoj

Znalost principu předávání hodnot, jak u základních, tak i referenčních datových typů, je naprosto nezbytná pro efektivní programování v Javě. Umožní vám lépe kontrolovat manipulaci s daty a předcházet potenciálním chybám.

Často kladené otázky

1. Jaký je přesný rozdíl mezi předáváním podle hodnoty a předáváním pomocí reference?

Při předávání podle hodnoty se vytváří kopie hodnoty proměnné, zatímco při předávání odkazem se předává pouze adresa v paměti, kde se daný objekt nachází.

2. Jaká je hlavní výhoda předávání podle hodnoty v Javě?

Hlavní výhodou je ochrana původních dat před neúmyslnými změnami, což zvyšuje stabilitu a čitelnost kódu.

3. Jak mohu v Javě předat objekt „odkazem“, pokud je to vůbec možné?

V Javě není přímá možnost předávat objekty „odkazem“ v klasickém smyslu, ale můžete předat kopii reference na objekt, což umožňuje manipulaci s obsahem objektu zevnitř funkce.

4. Co se myslí pod pojmy „Shallow Copy“ a „Deep Copy“?

Shallow Copy kopíruje pouze odkazy na objekty, zatímco Deep Copy se snaží kopírovat objekty i s jejich podřízenými objekty.

5. Jakou roli hrají konstruktory v kontextu předávání hodnot?

Konstruktory inicializují objekty a nevytvářejí kopie hodnot, ale alokují nový prostor v paměti pro daný objekt.

6. Platí to i pro pole, že se předávají „odkazem“?

Ano, pole v Javě jsou referenční typy, takže předávání pole do funkce v podstatě předává kopii reference na toto pole.

7. Je třída StringBuilder referenční typ?

Ano, StringBuilder je referenční typ v Javě.

8. Jak se dá zjistit, zda je proměnná typu String referenčního typu?

Všechny proměnné typu String v Javě jsou referenční typy.

9. Jak je možné v Javě simulovat chování předávání odkazem?

Předávání odkazem v Javě je možné simulovat pomocí objektů (tříd) a předáním reference na tento objekt.

10. Existuje způsob, jak vytvořit kopii reference na objekt, aniž by došlo ke změně původního objektu?

Ano, k tomuto účelu se používají konstrukty nazývané Copy Constructor, které vytvářejí nové objekty s daty kopírovanými z původních objektů.

Tagy: Java, předávání podle hodnoty, referenční typ, primitivní typ, proměnná, funkce, metoda, objekt, OOP, programování, vývojář, kód, úprava, reference, hloubková kopie, mělká kopie.