Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pocetnicka pitanja

[es] :: Java :: Pocetnicka pitanja

[ Pregleda: 1304 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2790 Profil

icon Pocetnicka pitanja02.10.2009. u 08:55 - pre 177 meseci
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?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

bantu

Član broj: 38670
Poruke: 305
89.111.240.*



+27 Profil

icon Re: Pocetnicka pitanja02.10.2009. u 10:08 - pre 177 meseci
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
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2790 Profil

icon Re: Pocetnicka pitanja02.10.2009. u 13:29 - pre 177 meseci
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.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9516
*.teletrader.com.



+10255 Profil

icon Re: Pocetnicka pitanja02.10.2009. u 14:35 - pre 177 meseci
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".
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

[es] :: Java :: Pocetnicka pitanja

[ Pregleda: 1304 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.