[ Nedeljko @ 02.10.2009. 08:55 ] @
Do sada sam picio C++, a sada ucim Javu. Kad sam mislio da su mi stvari jasne, ispalo je da neke elementarne stvari ne mogu da resim.

Code:
package reference;

class Reference {
    static Integer inc(Integer x) {
        ++x;
        return x;
    }
    static String hello(String s) {
        s = "Zdravo, svete!";
        return s;
    }
    public static void main(String[] args) {
        Integer x = new Integer(55);
        System.out.println(inc(x));
        System.out.println(x);
        String s = "Hello, world!";
        System.out.println(hello(s));
        System.out.println(s);        
    }
}

/** Output
56
55
Zdravo, svete!
Hello, world!
*/


Dakle, bez obzira na pricu o referencama, ovo je fakticki prenosenje po vrednosti. Kako da napisem funkciju koja menja objekat koji je prosledjen kao argument?
[ bantu @ 02.10.2009. 10:08 ] @
Probaj ovaj kod:
Code:

public class Reference {
    static Integer inc(Integer x) {
        ++x;
        return x;
    }
    static String hello(String s) {
        s = "Zdravo, svete!";
        return s;
    }
    static MojObjekat test(MojObjekat o) {
        o.setValue(2);
        return o;
    }
    public static void main(String[] args) {
        Integer x = new Integer(55);
        System.out.println(inc(x));
        System.out.println(x);
        String s = "Hello, world!";
        System.out.println(hello(s));
        System.out.println(s);
        MojObjekat o = new MojObjekat();
        System.out.println(test(o));
        System.out.println(o);
    }
}

class MojObjekat {

    private int i;
    
    MojObjekat() {
        this(1);
    }
    
    MojObjekat(int i) {
        this.i = i;
    }
    
    public void setValue(int i) {
        this.i = i;
    }
    
    public int getValue() {
        return i;
    }

    public String toString() {
        return "Broj je: " + i;
    }

}

Već je pisano o ovome ranije. Pročitaj ova dva posta i mislim da će ti biti sve jasnije. Ili ti možda neće biti ništa jasno. :)
http://www.elitesecurity.org/t325268-Pointeri-JAVA-ili-JAVI
http://www.elitesecurity.org/t357049-vezi-stringova
[ Nedeljko @ 02.10.2009. 13:29 ] @
Ma, pokapirao sam stvari u medjuvremenu.

++x kreira nov objekat tipa Integer i usmerava x (kao referencu, jer Integer nije primitiva) na njega, tako da to vise nije onaj stari Integer sa kojim je funkcija pozvana.

Stavise, koliko vidim, u Javi nije ostavljena nijedna mogucnost da se promeni vrednost Integer promenljive (tj. celog broja na koji se pokazuje), vec se moze samo instancirati nov objekat i usmeriti na njega.

Ako je x tipa integer i ukazuje na objekat na adresi 100, novu vrednost moze dobiti samo tako sto se instancira nov objekat npr. na adresi 200 sa novom vrednoscu, a x pokazivti na adresu 200.

Takodje, pokapirao sam ovo sa umotavanjem u klasu.

Nesto ovog tipa u C++ sintaksi

Code:

typedef struct MyClassData {
    int x;
    MyClassData(int value) {
        x = value;
    }
} *MyClass;

void inc(MyClass c) {
// Uvecava vrednost atributa promenljive sa mesta poziva
    ++(c->x);
// naredni red nema uticaja na promenljivu na mestu poziva
    c = new MyClassData(77);
}


bi imao sledeci Java ekvivalent

Code:

class MyClass {
    int x;
    MyClass(int value) {
        x = value;
    }
}

void inc(MyClass c) {
// Uvecava vrednost atributa promenljive sa mesta poziva
    ++(c.x);
// naredni red nema uticaja na promenljivu na mestu poziva
    c = new MyClass(77);
}


Dakle, kada menjam atribute, to se odrazava i na objekat za koji je pozvano, a kada se dodeljuje nova vrednost argumentu, to samo preusmerava lokalni pokazivac.
[ Java Beograd @ 02.10.2009. 14:35 ] @
Da, u Javi postoje immutable objekti. To su zapravo wrapper objekti (wrapper oko primitiva). Ima mnogo članaka na netu o tome, potraži, na primer "java immutable objects".