A neni to naopak?:
v jave se az na vyjimky vse predava jako pointer na heap (nektere primitivni parametry fce mohou byt predany pres stack diky optimalizaci).

"=" provadi prirazeni pointeru do promenne (prirazeni cisla, ktere specifikuje zacatek naseho objektu)

V pripade ze mam objekt immutable, nema zadnu metodu add, alter a pod, tj nejde upravit.

"=" nezpusobi zadnou ujmu objektu, protoze saha uplne jinam (do promenne s pointerem)

To ze jde upravit vstupni parametr a nemuset ho returnovat je sic prasarna, ale jde to protoze v oduvodnenych pripadech jako pametova naocnost a vykonnost pouzit. Sic se to pere s funkcionalnimi principy, ale coz... Navic ten objekt musi byt mutable. (viz nektere immutable kolekce, ktere pri pokusu o upravu vyhodi vyjimku).

Nebo chapu spatne:
Ne, původní pisatel to má správně, vše se předává hodnotou -- primitivní i referenční typy. Tohle je pekelně rozšířený omyl.


Diky
PP




On 04/04/2011 01:30 PM, Ladislav Thon wrote:

    nikoliv, naopak, vše je předáváno referencí.


Ne, původní pisatel to má správně, vše se předává hodnotou -- primitivní i referenční typy. Tohle je pekelně rozšířený omyl.

Předávání parametrů odkazem (referencí) by znamenalo, že můžete tu původní proměnnou "vyměnit", asi takhle:

void caller() {
  String a = "a";
  callee(a);
  // !!! co je v proměnné a?
}

void callee(String param) {
  String b = "b";
  param = b;
}

Kdyby se parametr param v metodě callee předával referencí, pak by na konci metody caller platilo "b".equals(a). Pokud se dobře pamatuju, v C# by to takhle fungovalo, kdyby ten parametr byl deklarovaný "ref String param".

Jenže referenční typy se v Javě předávají hodnotou -- dostanete kopii reference, takže můžete změnit _stav_ objektu (v ukázce ne, String je neměnitelný), ale nemůžete _vyměnit_ ten objekt jako takový.

Pro pole platí totéž, jsou to taky referenční typy (dalo by se říct, že to jsou vlastně taky objekty, a nebyla by to úplná lež).

LT


--
Petr Prikryl
-----------------------
[email protected]
[email protected]
www.admin24.cz

Odpovedet emailem