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

Pointeri i JAVA ili u JAVI :)

[es] :: Java :: Pointeri i JAVA ili u JAVI :)

Strane: 1 2 3 4 5

[ Pregleda: 18030 | Odgovora: 86 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9497
*.lukoil.co.yu.



+10254 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 09:05 - pre 193 meseci
@franticnick
Vidi, nemoj da se ljutiš, ali lupio si najžešće. I kao potvrdu naveo još veću glupost. Mogao bih nadugačko da ti objašnjavam ali me mrzi i nemam vremena. Ono šta je bitno da shvatiš je da je u momentu kad se izvodi b = new Integer() alocira se novo parče memorije. Tako se kreira nova referenca za promenljivu b, a promenljiva a nastavlja da živi "svoj život". Vrednost promenljive b se briše a memorijska lokacija oslobađa (Garbage collector) odmah nakon završetka funkcije change, zato što nema nijedne promenljive sa širim scope-om koji bi čuvao tu refrencu.
Još gore, za primer si uzeo i klasu Integer, koja je zapravo immutable wrapper oko primitive int. Zanimljivo je da si mogao da uzmeš i promenljivu tipa int da "potvrdiš" da se "u Javi sve prenosi po vrednosti".

Savet: Thinking in Java, Bruce Eckel.

OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

franticnick

Član broj: 19656
Poruke: 372
*.nedstat.nl.

Sajt: www.franticnick.com


+30 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 10:38 - pre 193 meseci
@Java Beograd

Ti bi trebao ozbiljno da se zabrines za svoje znanje i razumevanje Jave. Bilo bi jako dobro kada bi bar probao da se informises pre nego sto odgovoras ovde na forumu jer deluje neozbiljno otvarati raspravu o najosnovnijim stvarima. Evo samo prva 3 linka koja sam dobio kucajuci u googlu "java by value":

http://www.yoda.arachsys.com/java/passing.html
http://www.javaworld.com/javaw...a/2000-05/03-qa-0526-pass.html
http://javadude.com/articles/passbyvalue.htm

Prostudiraj ih dobro pre nego se ponovo javis.


Citat:

Ono šta je bitno da shvatiš je da je u momentu kad se izvodi b = new Integer() alocira se novo parče memorije. Tako se kreira nova referenca za promenljivu b, a promenljiva a nastavlja da živi "svoj život".


Ocigledno je da nisi shvatio primer koji sam naveo. Ajde probacu detaljno da objasnim. Vrednost promenljive a se predaje po vrednosti metodi change(Integer b). U prevodu to znaci da se pri pozivu metode change kreira nova promenljiva b (tipa Integer) i u nju SE KOPIRA adresa koju sadrzi promenljiva a (a to je memorijska adresa gde se nalazi new Integer(5)). Kada se pozove b = new Integer(10), promenljivoj b koja u tom trenutku sadrzi kopiranu vrednost promenljive a se dodeljuje nova adresna lokacija novokreiranog objekta new Integer(10). Bitna stvar za primetiti je da promenljiva b nema ama bas nikakve veze sa promenljivom a sem sto su obe promenljive u jednom kratkom vremenskom intervalu cuvale vrednost iste memorijske lokacije.

Poenta konkretnog primera nije nikakav garbage collector niti specificnost Integer tipa (ne razumem zasto mislis da bi bilo koji drugi tip bio bolji primer!?!), vec je cela poenta da je promenljiva b nova promenljiva u koju se kopira vrednost promenljive a tj. prenosi se PO VREDNOSTI a ne po referenci.

Citat:

Vrednost promenljive b se briše a memorijska lokacija oslobađa (Garbage collector) odmah nakon završetka funkcije change, zato što nema nijedne promenljive sa širim scope-om koji bi čuvao tu refrencu.


Jos jednom nisi u pravu. Kada se funkcija change zavrsi memorijska lokacija na koju je promenljiva b pokazivala postaje kandidat za brisanje (garbage collector) ali to nikako ne znaci da ce isti biti pozvan odmah nakon zavrsetka metode change. Jednostavno, ne postoji nacin koim bi mogao da utvrdis kada ce se pozvati garbage collector.

PS
Ako i dalje mislis da si u pravu, molio bih te da u tvoj sledeci post ukljucis primer da se u javi nesto moze preneti nekako drugacije sem po vrednosti.

savet: Ako te je knjiga koju si naveo naucila stvari kojima baratas ovde na forumu onda bi je trebalo zaobilaziti u najvecem luku.

[Ovu poruku je menjao franticnick dana 09.06.2008. u 11:57 GMT+1]
 
Odgovor na temu

Toxter
NS

Član broj: 39393
Poruke: 317
82.117.202.*



+6 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 11:03 - pre 193 meseci
@ franticnick

Moram reci da me iznenadjue sa kojim zarom zastupas svoju tezu.
Ne zelim da se raspravljam s tobom ali cu ti savetovati da procitas nesto o adresnoj aritmetici.
Zao mi je, ali ne da nisi u pravu nego si debelo "u krivu".

Pozdrav
Sad mu nije nista, ubio si ga k'o zeca...
 
Odgovor na temu

franticnick

Član broj: 19656
Poruke: 372
*.nedstat.nl.

Sajt: www.franticnick.com


+30 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 11:09 - pre 193 meseci
Citat:
Toxter: @ franticnick

Moram reci da me iznenadjue sa kojim zarom zastupas svoju tezu.
Ne zelim da se raspravljam s tobom ali cu ti savetovati da procitas nesto o adresnoj aritmetici.
Zao mi je, ali ne da nisi u pravu nego si debelo "u krivu".

Pozdrav


Zato sto verujem da sam u pravu ;) Na sta konkretno mislis kada kazes da sam debelo "u krivu"?

Ja sam eto dao primer i poslao 3 linka koja potvrdjuju ono o cemu pricam. Voleo bih da vidim kontraprimer ili link ka tekstu koji to opovrgava.

Evo da dodam jos jedan tekst sa IBM-ovog sajta "Understanding that parameters are passed by value and not by reference"

Citat:

A common misconception exists that parameters in Java are passed by reference. They are not. Parameters are passed by value. The misconception arises from the fact that all object variables are object references. This leads to some unexpected results if you do not understand exactly what is happening. ...


http://www.ibm.com/developerworks/library/j-praxis/pr1.html


@Java Beograd
U knjizi koju si predlozio (Thinking in Java) na 1018 strani stoji:

Citat:

1. Java passes everything by value. When you’re passing primitives
into a method, you get a distinct copy of the primitive. When you’re
passing a reference into a method, you get a copy of the reference.
Ergo, everything is pass-by-value.
...


[Ovu poruku je menjao franticnick dana 09.06.2008. u 13:10 GMT+1]
 
Odgovor na temu

mucky
Aleksandar Mastilović
Freelancer
Novi Sad - Srbija

Član broj: 237
Poruke: 412
*.neobee.net.



+1 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 12:23 - pre 193 meseci
Nisam se mnogo udubljivao u razlike onoga shto tvrdite, pa mi se chini da ste u sushtini svi u pravu ali se jednostavno ne razumete.

Pravila su prilichno jednostavna, ali se mnogo ljudi zbunjuje i previshe komplikuje stvari:

1. U Java jeziku, prenos promenljive izmedju funkcija je CALL BY VALUE (tj. po vrednosti). Shta ovo konkretno znachi? To konkretno znachi da, shta god poslali nekoj funkciji kao argument, funkcija ce za svoj argument primiti KOPIJU VREDNOSTI ORIGINALNOG ARGUMENTA.
2. Postoje dva tipa promenljivih: primitive i reference. Primitive su char, byte, short, int, long, float, double, boolean. Reference su promenljive koje pokazuju na nizove ili objekte. Inache, Java language specification ne pravi veliku razliku izmedju termina "pointer" i "reference", jer u Java jeziku nije lako napraviti ochiglednu razliku izmedju ta dva pojma kao shto je to moguce u C++ (C nema reference).

Poshto se svi tipovi prenose po vrednosti, znachi da se i reference prenose po vrednosti. Shto ce reci, menjanje reference unutar funkcije (ne menjanje objekta na koji ona pokazuje) nema nikakvog uticaja na referencu koju smo poslali funkciji kao argument.

Mozhda je najvazhnije objasniti shta u stvari znachi linija
Code:
Object a = new Object();

Code:
Object a
predstavlja referencu na objekte tipa Object. Takva promenljiva mozhe biti neicijalizovana, mozhe sadrzhati vrednost null, i mozhe sadrzhati referencu ka nekom objektu. "Referenca ka objektu" je u stvari adresa konkretnog objekta u Java memorijskom prostoru. Dakle, linija
Code:
Object a = new Object();
je u stvari uradila dve stvari:

1. Kreirala referencu ka objektima tipa Object (i za to zauzela 32 bita memorije na 32-bitnim sistemima)
2. Kreirala objekat tipa Object (i za to zauzela memorijskog prostora koliko je potrebno da se smesti objekat tipa Object), i njegovu adresu iskopirala u referencu iz tacke 1.

Znachi iako sa inicijalizovanom referencom nema druge aritmetike osim "dodeli adresu nekog drugog objekta" ili "dodeli vrednost null", referenca je i dalje zasebna promenljiva chija se vrednost (a njena vrednost je adresa objekta na koji pokazuje) prenosi BY VALUE drugim funkcijama.
 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9497
*.lukoil.co.yu.



+10254 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 12:37 - pre 193 meseci
.. a odmah u nastavku citiranog članka stoji
... Of course, the assumption is that you’re always thinking (and caring) that handles are being passed.

I odmah malo kasnije
Java passes primitives by value (no argument there), but objects are passed by reference.

@franticnick
Ne želim da raspravljam oko osnova programskog jezika kojeg profesionalno koristim koristim od '98. A ti ćeš mnogo lakše da preprodiš početne korake i nedoumice ako više budeš slušao i čitao, a manje se svađao sa celim svetom.

Dakle, čitaj, radi, uči, vremenom ćeš prihvatiti Java način razmišljanja, i ako si dobar developer, proniknućeš u sve tajne. Videćeš koliko su Java koncepti savremeniji od C-a.
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

franticnick

Član broj: 19656
Poruke: 372
*.nedstat.nl.

Sajt: www.franticnick.com


+30 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 12:41 - pre 193 meseci
@mucky
Lepo si objasnio.

Podstaknut ovom temom, malo sam proguglao i naisao na brdo stranica sa raspravama na ovu temu. U 99% slucajeva termin "referenca" je krivac za zabunu.

Mada iz postova "Java Beograd", razumem da on tvrdi da u javi nije moguce prenositi promenljivu po vrednosti (narocito sto je rekao da sam "lupio najzesce", kada sam poslao mali primer):

Citat:

Činjenica je da u C programskom jeziku može funkciji da se preda i vrednost, i pokazivač na memorijsku lokaciju vrednosti. pa postoji problematika o kojoj se uči i diskutuje: kad i kako predati vrednost a kad i kako predati pointer. Pointeri se na poseban način imenuju, na poseban način se njima barata i td. Dakle to su POINTERI.

U Javi je drugačije. Nema prenošenja vrednosti, ...


Jedino ako nije mislio na prenosenje vrednosti u smislu da se kopira ceo objekat na koji pointer (referenca) pokazuje. Toga zaista nema.
 
Odgovor na temu

franticnick

Član broj: 19656
Poruke: 372
*.nedstat.nl.

Sajt: www.franticnick.com


+30 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 12:43 - pre 193 meseci
Citat:
Java Beograd

@franticnick
Ne želim da raspravljam oko osnova programskog jezika kojeg profesionalno koristim koristim od '98. A ti ćeš mnogo lakše da preprodiš početne korake i nedoumice ako više budeš slušao i čitao, a manje se svađao sa celim svetom.


Ja samo zelim primer gde se promenljiva prenosi po referenci. Nadam se da to nije toliki problem buduci da Javu koristis od '98.

Pozdrav.
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl-3.sezampro.yu.



+13 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 12:53 - pre 193 meseci
I da upotpunimo ovu diskusiju

Code:

public class Female {

    private int titsSize;

    public Female(int titsSize) {
        setTitsSize(titsSize);
    }

    public int getTitsSize() {
        return titsSize;
    }

    public void setTitsSize(int titsSize) {
        this.titsSize = titsSize;
    }

    public String toString() {
        return "Size of my tits: " + getTitsSize();
    }

    public static void main(String[] args) {
        Female zaklina = new Female(2);
        System.out.println(zaklina);
        doubleTits(zaklina);
        System.out.println(zaklina);
    }

    private static void doubleTits(Female f) {
        f.setTitsSize(2 * f.getTitsSize());
    }

}
 
Odgovor na temu

franticnick

Član broj: 19656
Poruke: 372
*.nedstat.nl.

Sajt: www.franticnick.com


+30 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 12:57 - pre 193 meseci
@Vanja Petreski
Tek sad ces da napravis zabunu
 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9497
*.lukoil.co.yu.



+10254 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 13:13 - pre 193 meseci
Eto ti Vanja napisao primer.
Zabune u Javi zapravo ni nema. Zabunu PRAVE C developeri, koji zalutaju u Java programiranje, pa pokušavaju da terminima kojima baratuju u "svom svetu" sebi (i drugima !) objasne principe Java developmenta.

Već znam šta je sledeće u diskusiji: višetruko nasleđivanje! Pa kako to može u C++, pa kao Java fuj, to ne može, pa onda ovi prvi pišu kako se bez toga ne može programirati, a onda Java developeri pišu o interfejsima pa rako redom.

Preskočiću diskusiju, poštovana gospodo, ovaj put.

OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

franticnick

Član broj: 19656
Poruke: 372
*.nedstat.nl.

Sajt: www.franticnick.com


+30 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 13:14 - pre 193 meseci
Citat:
Java Beograd: .. a odmah u nastavku citiranog članka stoji
... Of course, the assumption is that you’re always thinking (and caring) that handles are being passed.

I odmah malo kasnije
Java passes primitives by value (no argument there), but objects are passed by reference.



Ako bi jos samo mogao da se slozis da se reference prenosi by value, mozda bi mogli da dodjemo do nekog zakljucka.

Ako ne ... onda dzaba sve te godine iskustva :)
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.xdsl.xnet.co.nz.



+3 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 13:25 - pre 193 meseci
Naravno da se u Javi sve prenosi preko vrednosti. Mislim da je nerazumevanje u tome sto neki smatraju da je u deklaraciji
Code:
Integer zzz;
zzz objekat a ne referenca na objekat tipa Integer. U C++u bi to bila deklaracija objekta ali u Javi je to deklaracija reference na objekat. U C++u se to isto postize sa Integer *zzz i tek onda mozemo da pisemo zzz = new Integer(2008).
 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9497
*.lukoil.co.yu.



+10254 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 13:26 - pre 193 meseci
@ franticnick
Eto vidiš kako ne možeš da shvatiš Java programiranje.
Ajde sada lepo ti nama kaži, kad si toliko zapeo za te vrednosti, kolika je vrednost (?!) reference žaklina iz posta Vanje Petreskog ? Uzgred, pazi to nije ono new Integer(10) iz tvog posta malo gore. I pazi, ne pitam kolike su joj sise, već kolika je vrednost te refrence ?

Koga zabole za tu vrednost ? Who cares ? Šta bi ti sa tom vrednošću ? Da je množiš ? Deliš, sabiraš ? Kad prestaneš da misliš o refrenci kao o vrednosti, onda si prešao prvi korak ka Java programiranju.

[Ovu poruku je menjao Java Beograd dana 09.06.2008. u 14:41 GMT+1]
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.xdsl.xnet.co.nz.



+3 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 13:33 - pre 193 meseci
Znaci ti mislis da java ponekad prenosi po referenci a ponekad po vrednosti (u zavisnosti od toga da li je parametar primitiva ili ne)? A sto se tice vrednosti referenci, moguce ih koristiti kao pointere i sabirati ih ali je to namerno zakomplikovano zbog sigurnosti. (sun.misc.Unsafe)

//edit: Izvinjavam se Java Beograd, mislio sam da se obracas meni

[Ovu poruku je menjao srki dana 09.06.2008. u 14:54 GMT+1]
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl-3.sezampro.yu.



+13 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 13:45 - pre 193 meseci
E ljudi, previse se brinete oko terminologije, stvari su proste (makar Java developerima koji razumeju sta se desava ).

Dakle, da zavrsimo ovu diskusiju:

U gornjem (mom) primeru mi lepo predajemo zaklinu f-ji (referencu na zaklinu). F-ja sada ima svoju referencu, ali koja ukazuje na isti objekat odnosno na istu ribu. Sve manipulacije nad tim objektom (pozivanja metoda) u okviru f-je imaju uticaja na taj jedan jedini objekat. I tu nema sta da ne bude jasno. Dakle efekti su trajni i kada se f-ja zavrsi, a ta lokalna referenca se gubi. I zabole nas za nju... Ona nam je samo sluzila da pridjemo objektu.

Ukoliko se uradi onaj new Integer(10) tada si jednostavno prevezao lokalnu referencu na neki drugi objekat (koji si upravo alocirao) i naravno da to nema uticaja na onaj new Integer(5). Java Beograd je lepo rekao da je to los primer jer je Integer immutable, sto znaci da ne mozes da ga menjas posto ga instanciras. Kada bi on imao metodu koja moze da promeni vrednost, onda bi video A ti si zato prevezao lokalnu referencu i time nista nisi uradio/pokazao..

A za one koji su bas zapeli, neka jos jednom procitaju sta je rekao mucky i to je to
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.xdsl.xnet.co.nz.



+3 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 13:48 - pre 193 meseci
Mislim da svi razumeju sta se desava i poenta je samo u terminologiji a izgleda da svi ne razumeju da je samo to u pitanju.
 
Odgovor na temu

franticnick

Član broj: 19656
Poruke: 372
*.nedstat.nl.

Sajt: www.franticnick.com


+30 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 13:49 - pre 193 meseci
Citat:
Java Beograd: Eto vidiš kako ne možeš da shvatiš Java programiranje.
Ajde sada lepo ti nama kaži, kad si toliko zapeo za te vrednosti, kolika je vrednost (?!) reference žaklina iz posta Vanje Petreskog ? Uzgred, pazi to nije ono new Integer(10) iz tvog posta malo gore. I pazi, ne pitam kolike su joj sise, već kolika je vrednost te refrence ?

Koga zabole za tu vrednost ? Who cares ? Šta bi ti sa tom vrednošću ? Da je množiš ? Deliš, sabiraš ? Kad prestaneš da misliš o refrenci kao o vrednosti, onda si prešao prvi korak ka Java programiranju.


Reci mi koji bi rezultat bio kada bi umesto:

Code:

private static void doubleTits(Female f) {
        f.setTitsSize(2 * f.getTitsSize());
    }


stajalo

Code:

private static void doubleTits(Female f) {
        f = new Female(120);
    }


Da li bi tada zaklina imala tits 120? Naravno ne. A zasto? Zato sto Female f samo cuva kopiju adrese koja je prosledjenja doubleTits i nista vise od toga. Promenljiva f nije objekat tipa Female vec samo "cuvar" adrese objekta tog tipa.

Kada koristis operator "." nad pointerom (referencom) koju Female f cuva tada Java "iscita" adresu iz promenljive f i pozove metodu nad objektom koji se nalazi na toj adresi. Zato Vanjin primer menja objekat cija adresa je prosledjena (u vidu kopije).

Moram da primetim da je Vanja pomalo "kvarno" ubacio ovaj primer kako bi se napravila jos veca pometnja. Naravno, odmah si se upecao



[Ovu poruku je menjao franticnick dana 09.06.2008. u 15:14 GMT+1]
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl-3.sezampro.yu.



+13 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 13:59 - pre 193 meseci
Zapravo, to je trebalo da TI pojasni stvari ;)

Ustvari, sada je jasno da se neki ljudi samo previse brinu oko "detalja", ali se razumemo..
 
Odgovor na temu

franticnick

Član broj: 19656
Poruke: 372
*.nedstat.nl.

Sajt: www.franticnick.com


+30 Profil

icon Re: Pointeri i JAVA ili u JAVI :)09.06.2008. u 14:03 - pre 193 meseci
Za kraj kako bi ovu diskusiju zavrsili u harmoniji i razumevanju, moram jos jednom da pitam "Java Beograd" da li se slaze da se reference u Javi uvek prenose by value ?

@srki
za sun.misc.Unsafe dosad jos nisam cuo, jako zanimljivo...

[Ovu poruku je menjao franticnick dana 09.06.2008. u 15:22 GMT+1]
 
Odgovor na temu

[es] :: Java :: Pointeri i JAVA ili u JAVI :)

Strane: 1 2 3 4 5

[ Pregleda: 18030 | Odgovora: 86 ] > FB > Twit

Postavi temu Odgovori

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