Este by som to vylepsil, aby bolo vidiet efekt:
I. Primitivy hodnotou:
public static void zlyPokusOZmenuParametra(int i) {
++i;
}
int i = 1;
zlyPokusOZmenuParametra(i);
System.out.println("i == " + i); // 1
II. Objekty referenciou
public static void zmenDate(Date d) {
d.setTime(0L);
}
Date date = new Date();
System.out.println("date == " + date); // v case mojeho spusteni
... date == Mon Apr 04 14:15:27 CEST 2011
zmenDate(date);
System.out.println("date == " + date); // date == Thu Jan 01
01:00:00 CET 1970
Niekde sa mozno stretnut so svojskou ukazkou kodu, kde sa Cckarske
odovzdanie pointra na typ do parametra hackne cez jednoprvkove pole:
public void cHack(int[] singletonArray) {
singletonArray[0]++;
}
int[] singletonArray = {2};
cHack(singletonArray);
System.out.println(singletonArray[0]); // 3
On 4. 4. 2011 14:18, Ondřej Fafejta wrote:
Zdravím,
jiná ukázka předávání hodnotou a odkazem ...
např. primitivní typ se vždy předává hodnotou
public static int zmenInt(int i) {
++i;
return i;
}
int i = 1;
zmenInt(i);
System.out.println("i == " + i); // 1
ale objekty se předávájí odkazem (resp. adresa pointeru ...)
public static Date zmenDate(Date d) {
d.setTime(0L);
return d;
}
Date date = new Date();
System.out.println("date == " + date); // v case mojeho spusteni
... date == Mon Apr 04 14:15:27 CEST 2011
zmenDate(date);
System.out.println("date == " + date); // date == Thu Jan 01
01:00:00 CET 1970
S pozdravem
Fafi
2011/4/4 Robert Novotny<[email protected]>:
Presne.
A) Mozete sa na to divat ako Cckar
Vsetko sa odovzdava hodnotou:
a) ak su to primitivne typy, tak je to zrejme
b) ak su to objektove typy, tak hodnotou odovzda adresa (pointer na objekt),
lenze s adresou nemozete robit pointerovu aritmetiku. Presmerovanie pointra
v metode nema ziaden dopad na samotny parameter, kedze ten sa do skutocneho
parametra nakopiroval hodnotou
c) pole je prakticky objektovy typ
B) Mozete sa na to divat ako Java
a) primitivne typy idu hodnotou
b) objektove typy idu referenciou, co prakticky znamena, ze pre ucely
manipulacie sa stotoznuje pointer na objekt so samotnym objektom. Ak mate
objekt v parametri metody, zmeny jeho atributov/vlastnosti su vidiet aj z
volajucej metody, ale ak do parametra v ramci metody priradite referenciu na
iny objekt, tato zmena sa mimo metody neprejavi.
public static void handleBuffer(byte[] data) {
data = new byte[] {3, 1, 5};
}
public static void main(String[] args) {
byte[] buffer = new byte[] {2, 4, 5};
handleBuffer(buffer);
System.out.println(Arrays.toString((buffer)));
// vypis 2, 4, 5
}
On 4. 4. 2011 13:48, Libor Jelinek wrote:
Takže dělá prostě něco jako toto:
static void zmenPoleBajtu(byte[] b) {
b[0] = 'd';
b[1] = 'e';
b[2] = 'f';
}
Díky! Už jsem doma! Proč jste to neřekl hned? :-) Ono je to s těmi
referencemi poměrně složité. Alespoň pro mojí hlavu :-) A jak tu někdo říkal
tak asi hodně programátorů prostě jen používá a nepřemýšlí co se přesně
děje. A čím víc umí Springů, J2EE a všeho podobného tím víc je možná
zarážející, že ty úplné nej low-level základy pokulhávají. Jako vysocí
matematici nemějí pak spočítat, kolik jim májí vrátit v krámě :-)
Děkuji pane Novotný za vysvětlení!
Libor