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