[ Jcod3r @ 04.06.2008. 20:43 ] @
Pozdrav !

Ovako, pricao sam sa profom jezika C i rekao mu da je profa algoritama rekao da u javi nema pointera, a on kaze da naprotiv u javi imaju samo pointeri, on konstruktore naziva pointerima npr Interger = new integer 5; ovo nam je naveo kao primjer pointera u javi ?

Sta kazu uceni :) ?
[ Jcod3r @ 04.06.2008. 20:59 ] @
I jos nesto, da ne govorim da je rekao za javu da nece za 5 godina ni postojati ccc....
[ grizzly @ 04.06.2008. 21:14 ] @
Jesi li ti siguran da znas francuski? :)
[ Jcod3r @ 04.06.2008. 21:58 ] @
Ha ha ha jok eto ne znam :)
Tip ima oko 60-65 god. izgleda prohlupo ali stvarno kazem da sam pricao sa njim i tako biser kaze... :) ustvari rekao je ako promjenimo ime BUS u TRAMVAJ to nista neznaci nego samo IME se promjenilo :) i da nemozemo napraviti pointer *nesto = nesto; ali sve se prevodi pointerima u JVM, eh tu sam stao i rekao nije problem raspitacu se...

Ma nije francuski tezak nego maras puno rukama mahat' :) ha ha ha
[ Jcod3r @ 04.06.2008. 22:30 ] @
Why dont you use pointers in Java?
In: JAVA

Answer
You do not use pointers in Java because the language designers decided to abstract memory management to a higher level in Java than in C. The reason for this is that it is easy to make mistakes using pointers and other lower level memory management techniques. These mistakes can lead to bugs. hard to read code, memory leaks that waste system resources, and security issues. Instead for the most part Java takes care of memory management for the user who can instead specify behavior though the object oriented techniques that are safer and easier to understand. The downside is that the programmers lose some control and flexibility in using memory. Also, programs using Java take a small performance hit in some cases because of the extra work Java has to do to manage memory itself.





Answer

They are, however in Java they are called references.


Eh sad se i tema moze izbrisati lagano :)
[ franticnick @ 04.06.2008. 22:57 ] @
Profa te nije lagao. Interno JVM stvarno barata pointerima. NekaKlasa obj = new NekaKlasa() jeste primer pointera u Javi.

Koristan link (izguglano na brzinu): http://www.saxoft.com/get.php?page=midptut0

Citat:

Java is based on the C and C++ syntax, so those of you familiar with these languages will have no problems learning it. The major difference is in Java there are no pointers. They designed it such ways, so it would be easier for coders to use it. The truth is, instead almost everything is a pointer, you just cannot see it. I said almost everything, the exceptions are the basic types


[Ovu poruku je menjao franticnick dana 05.06.2008. u 00:14 GMT+1]
[ ilderim @ 05.06.2008. 12:37 ] @
Vidi sa programerske tacke , Java nema pointere,to kako JVM interno barata pod Windows okruzenjem to je drugo,jer svaka VM ima odgovarajuci native kod kojim korespondira sa resursima,bilo na Win,Linux,Unix,Solaris ili Mac OS,ali kao programer treba da znas da nema pointera u Javi,kao u C++ ili kao delegate u C#

Programer
[ Java Beograd @ 05.06.2008. 13:37 ] @
Pa i jeste i nije. Isto tako se može reći da sa programerske tačke gledišta, u Javi su sve promenljive - pointeri. (Osim primitiva).

Bilo kako bilo, pogrešno je terminologiju programskog jezika C koristiti u programskom jezuku Java. Otud i nedefinisanosti, nedorečivosti i višeznačnosti.
[ franticnick @ 05.06.2008. 13:52 ] @
Citat:
Java Beograd:
Bilo kako bilo, pogrešno je terminologiju programskog jezika C koristiti u programskom jezuku Java. Otud i nedefinisanosti, nedorečivosti i višeznačnosti.


Slazem se. Medjutim ako se ipak zeli upotrebiti terminologija C/C++ (u nedostatku bolje), onda ipak vise lezi naziv "pointer" nego "referenca".
[ Java Beograd @ 05.06.2008. 14:16 ] @
Nikako. Termin "pointer" je mnogo, mnogo lošiji od termina "referenca".
[ franticnick @ 05.06.2008. 15:05 ] @
Citat:
Java Beograd: Nikako. Termin "pointer" je mnogo, mnogo lošiji od termina "referenca".


Ne bih se slozio. Ako pogledas sta su reference u C/C++ one nemaju nikakve veze sa Javom, dok pointeri jos nekako i lice.
[ franticnick @ 05.06.2008. 15:19 ] @
Ok, malo sam proguglao. Izgleda da se odomacio izraz "reference value" za ono sto imamo u Javi. Mada kao sto rekoh taj naziv "referance" nema nikakve veze sa referencama u C/C++.

Evo sta kaze JLS (The Java Language Specification)

Citat:

4.3.1 Objects
An object is a class instance or an array.

The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object.


link: http://java.sun.com/docs/books...on/html/typesValues.html#4.3.1

BTW jos nisam dobio "null reference exception" i dalje je "null pointer exception" :)

[Ovu poruku je menjao franticnick dana 05.06.2008. u 17:35 GMT+1]
[ Jcod3r @ 05.06.2008. 22:54 ] @
Ok, hvala na pojasnjenjima :)
[ aleksandar.dragojlovic @ 06.06.2008. 01:26 ] @
Preuzeto sa: http://en.wikipedia.org/wiki/Java_(programming_language) .

Citat:

Java does not support pointer arithmetic as is supported in, for example, C++. This is because the garbage collector may relocate referenced objects, invalidating such pointers. Another reason that Java forbids this is that type safety and security can no longer be guaranteed if arbitrary manipulation of pointers is allowed.


I ono što smo mi učili na fakultetu: zbog bezbednosti Java ne podržava pointere. Znači u pozadini JVM naravno mora raditi sa pointerima, ali niti programer niti korisnik ne mogu to videti niti mogu u programima koristiti pointere. Zamislite sajt koji učitava aplet (tipa onog chat-a na krstarici), i slobodno vršlja po celom disku jer je Java dopustila da autor tog apleta može da radi šta hoće. Nedostatak pokazivača je i mana i prednost, zavisi sa koje se strane posmatra.

Kao što kaže gore, promenljiva može da bude referenca na neki objekat, ali ne i pokazivač. Taj objekat u radu može da bude pomeren na neku drugu lokaciju usled manjka prostora u memoriji ili sličnih problema. Takođe reference se koriste pri "sakupljanju smeća".

Mislim nisam ja pametan više nego drugi, i ne znam više od vas, ali na samom početku bilo koje knjige o Javi se govori o razlici između C-a i Jave, i uvek se kao glavna razlika navodi nedostatak pointera.

Dakle kako JVM radi u pozadini nije bitno za korisnika, bitno je da kada programer piše program u Javi on ne koristi direktno pokazivače već radi sa referencama na objekte.
[ Java Beograd @ 06.06.2008. 07:27 ] @
Citat:
franticnick: Ne bih se slozio. Ako pogledas sta su reference u C/C++ one nemaju nikakve veze sa Javom, dok pointeri jos nekako i lice.

Pa upravo sam to i napisao. Pogrešno je koristiti terminologiju C/C++ u Javi.

Ako napišem

MyClass myClass = new MyClass();
foo.doSomething(myClass);

Ja nisam predao POINTER na myClass već sam predao REFERENCU na myClass.
[ franticnick @ 06.06.2008. 11:15 ] @
Code:

MyClass myClass = new MyClass();
foo.doSomething(myClass);

Ja nisam predao POINTER na myClass već sam predao REFERENCU na myClass.


Mozes da je nazivas REFERENCA ili kako god volis, ali cinjenica je da si predao najobicniji pointer na objekat.

I samo da napomenem da pointer kao termin nije vezan ni za jedan programski jezik (pa ni za C++). Dakle, citiram ponovo Java Language Specification:

Citat:

4.3.1 Objects
An object is a class instance or an array.

The reference values (often just references) ARE POINTERS to these objects, and a special null reference, which refers to no object.


[ Java Beograd @ 06.06.2008. 11:34 ] @
Ajde da vidimo o čemu se priča. Engleska reč, glagol, to point prevedno na srpski znači pokazati. Izvedena imenica, pointer znači pokazivač. Engleska reč reference, u kontekstu o kome pričamo znači veza.

Dakle, poenta je u tome da se ne barata vrednostima, nego vrednosti stoje u memoriji, a funkcijama se predaju samo "veze do mesta u memoriji" odnosno "pokazivači do mesta u memoriji". To je potpuno isto.

Č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, nema posebnog načina označavanja posebnih promenljivih koje u sebi nose oznaku memorijske lokacije. Dakle, nema te problematike, nema tih i takvih POINTERA. Ima REFERENCI na objekte, smeštene negde u memoriji. Jeste isto, ali i nije. Drugačija je problematika pa je drugačija i terminologija.

Zamajac u motoru jeste zupčanik, ali ga niko ne zove zupčanikom, zato što je zamajac.
[ augustus @ 06.06.2008. 11:43 ] @
Mozda reci da u javi nema aritmetike sa pokazivacima. Citaj vrednosti sa
lokacija na koje pokazuju i to je sve.
[ franticnick @ 06.06.2008. 12:07 ] @
Citat:
Java Beograd

Č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, nema posebnog načina označavanja posebnih promenljivih koje u sebi nose oznaku memorijske lokacije...


Hej, polako. U javi se upravo SVE PRENOSI PO VREDNOSTI. Tako recimo sledeci kod predaje funkciji pointer (ili ako bas hoces referencu) PO VREDNOSTI:

Code:

public class Main
{
    static public void main(String ... args)
    {
        Integer a = new Integer(5);
        System.out.println("before: " + a);
        change(a);
        System.out.println("after: " + a);
    }
    
    static void change(Integer b)
    {
        b = new Integer(10);
    }
}


pa je rezultat 5, a ne 10.


[ franticnick @ 06.06.2008. 12:10 ] @
Citat:
augustus: Mozda reci da u javi nema aritmetike sa pokazivacima. Citaj vrednosti sa
lokacija na koje pokazuju i to je sve.


Upravo.
[ Java Beograd @ 09.06.2008. 09:05 ] @
@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.
[ franticnick @ 09.06.2008. 10:38 ] @
@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]
[ Toxter @ 09.06.2008. 11:03 ] @
@ 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
[ franticnick @ 09.06.2008. 11:09 ] @
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]
[ mucky @ 09.06.2008. 12:23 ] @
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.
[ Java Beograd @ 09.06.2008. 12:37 ] @
.. 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.
[ franticnick @ 09.06.2008. 12:41 ] @
@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.
[ franticnick @ 09.06.2008. 12:43 ] @
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.
[ anon315 @ 09.06.2008. 12:53 ] @
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());
    }

}
[ franticnick @ 09.06.2008. 12:57 ] @
@Vanja Petreski
Tek sad ces da napravis zabunu
[ Java Beograd @ 09.06.2008. 13:13 ] @
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.
[ franticnick @ 09.06.2008. 13:14 ] @
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 :)
[ srki @ 09.06.2008. 13:25 ] @
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).
[ Java Beograd @ 09.06.2008. 13:26 ] @
@ 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]
[ srki @ 09.06.2008. 13:33 ] @
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]
[ anon315 @ 09.06.2008. 13:45 ] @
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
[ srki @ 09.06.2008. 13:48 ] @
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.
[ franticnick @ 09.06.2008. 13:49 ] @
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]
[ anon315 @ 09.06.2008. 13:59 ] @
Zapravo, to je trebalo da TI pojasni stvari ;)

Ustvari, sada je jasno da se neki ljudi samo previse brinu oko "detalja", ali se razumemo..
[ franticnick @ 09.06.2008. 14:03 ] @
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]
[ Java Beograd @ 09.06.2008. 14:09 ] @
Citat:
franticnick: ...
Zato Vanjin primer menja objekat koji je prosledjen.
...
Moram da primetim da je Vanja pomalo "kvarno" :) ubacio ovaj primer kako bi se napravila jos veca pometnja. Naravno, odmah si se upecao :)


Wow ! Vanjin primer menja objekat koji je prosleđen ! Mirakul ! Kako li se samo Vanja toga setio !? Sasvim neuobičajen i "kvaran" primer za Javu. I ja sam se "upecao" !

Sine, prema tvojim postovima, jasno je da si za termin "referenca" saznao pre tri dana:

Citat:
franticnickOk, malo sam proguglao. Izgleda da se odomacio izraz "reference value" za ono sto imamo u Javi.


Tj. pre tri dana si "malo proguglao" u vezi Jave. Ali eto, već danas žariš i pališ i "deliš lekcije".

Bila jedna pesma Riblje Čorbe (popularna rok grupa u SFRJ tokom 80-tih) o alavosti i balavosti.
[ franticnick @ 09.06.2008. 14:37 ] @
Citat:
Java Beograd: Tj. pre tri dana si "malo proguglao" u vezi Jave. Ali eto, već danas žariš i pališ i "deliš lekcije".

Bila jedna pesma Riblje Čorbe (popularna rok grupa u SFRJ tokom 80-tih) o alavosti i balavosti.


Jeste, procitao si me. Pre tri dana sam jedva nesto malo citao o Javi i to je to :)

Nego molio bih ako mozes da odgovoris na: "Da li se slazes da se reference u Javi uvek prenose by value?"
[ augustus @ 09.06.2008. 14:45 ] @
Naravno da se prenose, ali poenta je bila da se sa njima ne mozes igrati
nego samo sa objektima na koje te reference ukazuju.Sta ti vredi prenos
reference po vrednosti kad ti nista ne znaci. Objekat je ono sto nas
zanima. Kako bi nazvao kad u C++ prosledis pokazivac funkciji? Prosledio
sam pokazivac po vrednosti? A kako kad prosledis pokazivac na pokazivac?
Hehe...kad se samo setim toga....
[ franticnick @ 09.06.2008. 14:58 ] @
@augustus
Moja poenta je da se u Javi sve prenosi po vrednosti. To pokusavam da kazem u ne znam koliko poslednjih postova.

Sto se tice C++ zavisi kako bi argument f-je bio deklarisan :)
[ augustus @ 09.06.2008. 15:03 ] @
Problem je sto se tako ne mozes izraziti bez objasnjenja.
fuja(Object o) - i kad kazes da se prenosi po vrednosti, prva stvar koja
se pomisli jeste ta da se vrednost objekta o prosledila, a nije vec
vrednost njegovog pokazivaca ili ti referenca ili ti neka tamo lokacija
u memoriji.
[ franticnick @ 09.06.2008. 15:10 ] @
@augustus
U postu gde objasnjavam Vanjin primer (a i u onom gde objasnjavam moj) objasnio sam na sta mislim. A imate i mucky-jev post gde je sve kristalno jasno. Tesko da je to moglo ostati nerazjasnjeno.
[ mucky @ 09.06.2008. 19:01 ] @
Svako u svojoj glavi mozhe ovu problematiku objashnjavati kako hocje, pa eto mozhe recji i da se objekti u Javi prosledjuju po referenci.

Ali ipak je ovo javni forum, i dosta pochetnika ovde dolazi da neshto nauchi, i stoga smatram da se stvari moraju nazivati pravim imenima. Jeste tezhe i komplikovanije, ali je jedino ispravno!

Dakle, josh jednom cju ponoviti:

1.
Code:
Object a = new Object();

Promenljiva a NIJE objekat. Promenljiva a je POKAZIVACH NA OBJEKTE TIPA Object, i nakon izvrshavanja ove linije taj pokazivach u sebi sadrzhi adresu ka novokreiranom objektu. Pokazivach a mozhete menjati na dva nachina: dodeliti mu adresu nekog drugog objekta, ili vrednost null. Od logichkih funkcija, pokazivachi u Java jeziku podrzhavaju samo proveru (ne)jednakosti.

2. U Java programskom jeziku, funkcijama se svi argumenti prosledjuju PO VREDNOSTI (CALL BY VALUE). Poshto objektima pristupamo preko pokazivacha (ili reference, svejedno), funkcijama zapravo ne prosledjujemo objekte nego pokazivache na te objekte. Postoje programski jezici u kojima je implementirano pravo prosledjivanje argumenata po referenci (call by reference), ali u Java jeziku to definitivno nije sluchaj.
[ jablan @ 09.06.2008. 21:45 ] @
Ja nemam neko veliko Java iskustvo, ali nije li malo rogobatno stalno pričati "metoda prima referencu na objekat klase T" umesto "metoda prima objekat klase T"? Čisto onako sa stanovišta jezičke i mentalne ekonomije? Mislim, nikad se i ne prosleđuju sami objekti, jel tako? Dakle, kad neko kaže "prosleđujem objekat", uvek podrazumeva da prosleđuje referencu. A ako već, apstraktno gledano, prosleđuje objekat, taj objekat se defakto prosleđuje po referenci (što je ekvivalentno tome da se zapravo njegova referenca prosleđuje po vrednosti).
[ franticnick @ 09.06.2008. 22:29 ] @
Citat:

"There is exactly one parameter passing mode in Java - pass by value - and that helps keep things simple." The Java Programming Language, 2nd ed. by Ken Arnold and James Gosling, section 2.6.1, page 40, 3rd paragraph.


Za one koji ne znaju, James Gosling se smatra autorom programskog jezika Java. (http://en.wikipedia.org/wiki/James_Gosling)
[ jablan @ 09.06.2008. 22:44 ] @
Sve to stoji, ali da li ja zaista grešim ako kažem da sam ovime: metoda(objekat) pozvao metodu i prosledio joj objekat (po referenci)?
[ srki @ 09.06.2008. 23:30 ] @
Citat:
jablan: Ja nemam neko veliko Java iskustvo, ali nije li malo rogobatno stalno pričati "metoda prima referencu na objekat klase T" umesto "metoda prima objekat klase T"? Čisto onako sa stanovišta jezičke i mentalne ekonomije? Mislim, nikad se i ne prosleđuju sami objekti, jel tako?


U Javi ne ali u C++u da! Recimo ako u C++u definisemo someFunction(Integer i) onda ce se za razliku od Jave zvati copy constructor za objekat i, pa ce se lepo preneti samo vrednost. To je zato sto u C++u deklaracija Integer i; znaci da je i objekat tipa Integer dok to u Javi znaci da je i konstantni pointer na objekat tipa Integer. U C++u bi to pisao kao Integer* const i = new Integer(10);.

Citat:
Sve to stoji, ali da li ja zaista grešim ako kažem da sam ovime: metoda(objekat) pozvao metodu i prosledio joj objekat (po referenci)?
Kao sto rekoh, u pitanju je samo terminologija oko koje se ne slazemo ali izgleda da je Java Beograd to prevideo pa je pomislio da neko ne razume sta se desava i to je razlog njegovog tona.

@Gosha: sta je pogresno rekao da bi pitao koliki mu je staz u programiranju?

[Ovu poruku je menjao srki dana 10.06.2008. u 00:43 GMT+1]
[ gosha @ 10.06.2008. 00:50 ] @


Kome i dalje nije jasno neka menja profesiju ;)

Poz. Gosha
[ srki @ 10.06.2008. 01:06 ] @
Izgleda da tebi nije jasno sta je on pokusao da kaze a i ja u mojoj poruci. U pitanju je terminologija i ja to posmatram kao da je u Javi nemoguce napraviti promenjivu koja je Objekat vec samo promenjivu ciji je tip konstantni pokazivac na neki objekat (za razliku od C++ gde je moguce uraditi i jedno i drugo). Zbog toga smatram da je u Javi uvek pass by value kao sto kaze i tvorac jave dok u C++u mozes da deklarises funkciju da bude i pass by reference. Da li ti isto tako mislis ili mislis da je u javi ponekad pass by reference a ponekad pass by value u zavisnosti od toga da li je promenjiva primitiva ili ne?
[ mucky @ 10.06.2008. 01:46 ] @
Znachi Gosho, u tvojoj interpretaciji sheme koju si nam tako samouvereno poslao, kada u call by value jeziku nekoj funkciji prosledimo pointer na objekat, u toj funkciji dobijemo i kopiju pointera i kopiju objekta? Katastrofa!
[ Au197/79 @ 10.06.2008. 08:59 ] @
Goshin primer pod a) (uz grešku koju je mucky primetio) je iz C++, dakle čovek je promašio podforum. Kao što je već rečeno u javi se objektni nikad ne prenose niti postoji promenjiva koja čuva objekat, već se isključivo čuvaju i penose <java terminologija>reference</javina terminologija> što je slično <c/c++ i uobičajena terminologija>pokazivačima samo bez mogućnosti primene aritmetičkih operatora, nema uzimanja adrese sa &, nema derefereciranja sa * ili -> (zapravo ima sa „.“) , a sva ostala analogija funkcioniše</c/c++ i uobičajena terminologija>

Način prenošenja argumenata na parametre se u uobičajenoj terminologiji zove call by value i bukvalno je isti kao u C-u. Call by reference je ono sa VAR parametrima u paskalu. Jeste da se to interno prevodi na prenošenje pokazivača i menjanje onoga na šta pokazivač pokazuje (što se C-u može ručno uraditi, a i u javi je ekvivalentno menjanju objekata preko referece, ali nije moguće uraditi sa prostim tipovima, osim preko nekog wrapera koji nije immutable) ali Call by reference je kad ti u samom jeziku imaš direktnu podršku za to.

[Ovu poruku je menjao Au197/79 dana 10.06.2008. u 10:14 GMT+1]
[ gosha @ 10.06.2008. 09:31 ] @
Citat:
mucky: Znachi Gosho, u tvojoj interpretaciji sheme koju si nam tako samouvereno poslao, kada u call by value jeziku nekoj funkciji prosledimo pointer na objekat, u toj funkciji dobijemo i kopiju pointera i kopiju objekta? Katastrofa!

A jesam li ja nacrtao memoriju ili funkciju ? Lepo odgovoris na ovo pitanje pa ces, nadam se, skontati sta je "katastrofa" u celoj ovoj temi.
I da posle 20 godina programiranja mogu krajnje samouvereno da nastupam u objasnjavanju kako se posmatra nacin prenosenja parametara.

Za kraj od mene jos jedan nacin za odlucivanje da li je BY REF ili BY VAL:

Class A (mod: greska treba Objekat A)

prosledjujem A

da li ce izmene nad A ostati po izlasku iz f-je ?

HOCE - PASS BY REFERENCE
NECE - PASS BY VALUE

Poz. Gosha

[Ovu poruku je menjao gosha dana 10.06.2008. u 10:46 GMT+1]
[ Java Beograd @ 10.06.2008. 09:38 ] @
Hvala bogu da neko nešto pametno napiše. (Mislim na poslednji post Au197/79 i potpuno poslednje Gošine reči)

Uzgred, primećujem nekoliko pojava:
- S idejom "SVE JE TO ISTO" C++ develoepri kreću u Java development, i ni ne pokušavaju da počnu da razmišljaju u Javi.
- Masa svršenih i nesvršenih studenata raznih fakulteta prenosi "znanja" svojih asistenata iz skripti sumnjivog kvaliteta.

Ali nije to ništa naspram papazjaniji u C# svetu gde su se sjatili i Java i C++ developeri, a vesela objektno orijentisana družina je upotpunjena belosvetskom komunom Visual Basic (!?) developera. Šlag na tortu čine ASP i PHP developeri. Šta je sledeće ?
[ Toxter @ 10.06.2008. 09:43 ] @
Citat:
gosha:
Class A

prosledjujem A

da li ce izmene nad A ostati po izlasku iz f-je ?

HOCE - PASS BY REFERENCE
NECE - PASS BY VALUE

Poz. Gosha



Ovo je sustina svega.

Pozdrav
[ franticnick @ 10.06.2008. 09:44 ] @
Citat:
jablan: Sve to stoji, ali da li ja zaista grešim ako kažem da sam ovime: metoda(objekat) pozvao metodu i prosledio joj objekat (po referenci)?


Pa sad, ako stvari posmatras filozofski onda verovatno ne gresis ;) Nego ozbiljno, mislim da je oko ovih stvari veoma vazno biti krajnje precizan i odredjen. Vidis i sam koliko je proizvoljnih tumacenja napravila losa definicija "pass by reference" koja se eto jos uvek moze naci i u ponekoj Java knjizi.
[ mucky @ 10.06.2008. 10:01 ] @
Citat:
gosha: A jesam li ja nacrtao memoriju ili funkciju ? Lepo odgovoris na ovo pitanje pa ces, nadam se, skontati sta je "katastrofa" u celoj ovoj temi.
I da posle 20 godina programiranja mogu krajnje samouvereno da nastupam u objasnjavanju kako se posmatra nacin prenosenja parametara.


Mi se ovde upljuvali prichajucji o prenoshenju argumenata funkciji, ti se pojavljujesh sa dijagramom sumnjive relevantnosti i sa 20 godina programerskog iskustva, i sad josh relativizujesh "na shta si u stvari mislio". Chak ni time necesh da nas prosvetlish, nego nas pushtash da eto sami, glupavi, neprofesionalni i neiskusni zakljuchimo shta si ti u stvari hteo da nam kazhesh.

I taj tvoj primer je opet neprecizan, jer se "objekat A" mozhe proslediti funkciji preko pointera ili direktno (naravno, direktno ne mozhe u Java jeziku). I shta onda to tvoje iskusno rezonovanje "HOCE-NECE" znachi? Ovo je retorichko pitanje, ne morash odgovarati.

Ja sam sa svoje strane do sada rekao ono shto mislim da je vredno pazhnje, i da je 100% istina (ne po mom rezonovanju nego zvanicnom ispravnom rezonovanju). Stoga, povlachim se odavde kao i Java Beograd (i ne zovem svog Goshu da me brani dijagramima) :)


P.S. I moja baba-strina je imala 80+ godina pa u zhivotu nije videla more. It's not about the year of production, it's about the mileage.
[ franticnick @ 10.06.2008. 10:08 ] @
Citat:
Toxter: Ovo je sustina svega.

Pozdrav


Imam za tebe jedno pitanje, cisto da vidim kako ti poimas ovo sto si rekao.

Kako to da Vanjin primer u jednom slucaju menja vrednost zaklininih tits (originalni Vanjin primer) a u drugom (mala izmena koju sam nacinio) ne? Sta bi ti rekao, da li je promenljiva prosledjena BY REFERENCE ili BY VALUE ? Pazi potpis funkcije u oba slucaja je isti, izmenjeno je samo telo funkcije!

Originalni Vanjin primer:
Code:

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());
    }

}


moja izmena:
Code:

private static void doubleTits(Female f) {
        f = new Female(120);
    }
[ gosha @ 11.06.2008. 13:29 ] @
@mucky
To sto si ti rekao jeste po zvanocnom ispravnom rezonovanju citanja specifikacije Java jezika i njene tacke 8.x.x., koja govori da kompajler treba da iskopira vrednost reference u memoriji.
Ako si ti proizvodjac Java kompajlera e onda to jeste merodavan dokumenat za tebe, ali ovde se radi o koriscenju java kompajlera, teoriji komapajlera i teoriji programiranja.

Pass by reference, Pass by value, Reference, pointer i td su pojmovi koji su definisani mnogo pre JAVE i u svim programskim jezicima oni znace isto i na isti nacin se tumace.

Ovde je problem sto se referenca pogresno tumaci. Da objasnim plasticno:
Petar(objekat) ima nadimka Perica(referenca). Cesto ce te u literaturi videti da se reference porede sa alijasima, znaci samo drugi naziv za isti predmet. Kada ja viknem: "Perice okreni se.", nece se okrenuti njegovo ime (vrednost reference) u "rateP", nego ce se okrenuti on kao osoba(objekat).
Znaci kada se obracate referenci uvek se gleda isto kao da se obracate Objektu.
U tome i jeste razlika izmedju pointera i reference sto se kod pointera uvek obradjate memoriskoj adresi koja upucuje na Objekat.

Kada se pojam reference primeni na prenos parametara (u bilo kom jeziku) uvek se smatra da je parametar Objekat na koji ta referenca ukazuje, a ne sama vrednost reference.
Ovo je jedino ispravno tumacenje parametara u svim programerskim jezicima ovoga sveta jer se svi oni baziraju istim pojmovima.

Da prenesem teoriju u praksu:

Proizvodnja programa dizajniranog u UML.

Vidi ova klasa kaze da prosledim parametar(Objekat) po vrednosti. A da parametri u JAVI se prenose po vrednosti, znaci ne treba nista da uradim.
Gadan za***.

Obezbedim da mi klasa ima clone() i prilikom prosledjivanja parametara je koristim. - ISPRAVNO


Svi koji i dalje gledaju da se u javi parametri prenose po vrednosti ce imati problema ako nekada budu radili u vecim timovima sastavljenim od programera koji rade u razlicitim jezicima.
Lepo je sto ja mogu da odem u francusku i da pricam srpski jezik ali bojim se da me nece niko razumeti.
Isto tako Java programer treba da prica na univerzalnom programerskom jeziku, a ne da palamudi da je vrednost reference parametar, a ne objekat na koji ona ukazuje.
Ponavljam jos jednom referenca je nacin, a parametar je Objekat.

Poz. Gosha
[ srki @ 11.06.2008. 15:10 ] @
Gosho, sve sto si objasnjavao svi vec znaju ali nikako da razumes da je rec samo o tome da koristimo razlicitu terminologiju.
Citat:
gosha:
Vidi ova klasa kaze da prosledim parametar(Objekat) po vrednosti. A da parametri u JAVI se prenose po vrednosti, znaci ne treba nista da uradim.
Gadan za***.


Ali ja ne smatram da u Javi mozes da preneses Objekat vec samo pokazivac na taj objekat. Kada u C++u napises Integer a onda se to kreira na steku i a je referenca od objekta dok se u Javi kreira objekat na heap-u a na steku je samo taj pokazivac na taj objekat (isto kao u C++u Integer* a). Kada pozovem neku funkciju(a) tu ce da mi se prosledi vrednost tog pokazivava a. Ja koristim istu terminologiju kao kreator Jave koji kaze da se u Javi sve prenosi po vrednosti. Da li hoces da kazes da on gresi?

Citat:
Svi koji i dalje gledaju da se u javi parametri prenose po vrednosti ce imati problema ako nekada budu radili u vecim timovima sastavljenim od programera koji rade u razlicitim jezicima.

Ja upravo mislim obrnuto. Radim u timu od 20 ljudi (a samo na ovom spratu nas ima oko 60) i koristimo barem 6 razlicitih jezika i nemam apsolutno nikakvih problema. Da postoji problem vec bi se menadzeri ili kolege zalili ali upravo je obrnuta situacija.

Citat:
Ponavljam jos jednom referenca je nacin, a parametar je Objekat.

Ne, parametar je pokazivac na objekat ali opet to ne znaci da ti nisi u pravu vec jednostavno koristimo drugu terminologiju. Zasto bi inace kreator jave rekao da se u javi sve prenosi po vrednosti? Ispalo bi da se objekat prenosi po vrednosti ako bi on koristio tvoju terminologiju.

[Ovu poruku je menjao srki dana 12.06.2008. u 09:20 GMT+1]
[ Dragi Tata @ 11.06.2008. 15:41 ] @
Citat:
gosha:  Svi koji i dalje gledaju da se u javi parametri prenose po vrednosti ce imati problema ako nekada budu radili u vecim timovima sastavljenim od programera koji rade u razlicitim jezicima.


Upravo obrnuto. Kada meni (prevashodno C++ programeru) neko kaže da prenosi objekat po referenci, jedino što ću da pomislim je:

Code:


void funkcija(Objekat& o);
...
Objekat o;
funkcija (o);


A to je nešto sasvim drugo nego prosleđivanje referenci na objekte u Javi - ovde je objekat imenovan i mogu da mu pristupam direktno, a u Javi je anoniman i pristupam mu samo preko referenci koje su imenovane.

C# programer će da pomisli da pozivaš nešto kao:

Code:

var o = new Object();
funkcija (ref o);


itd.

Ne vidim čemu rasprava: U Javi se sve prenosi po vrednosti, što ima svojih dobrih strana (jednostavnost) i loših (probaj da napišeš metod swap u Javi).
[ gosha @ 11.06.2008. 17:18 ] @
Srki u prvoj recenici sam napisao da je to stanoviste tacno ako citas Java specifikaciju. U njoj lepo pise da se vrednost referenci kopira prilikom prosledjivanja f-ji.
Ja to nisam ni sporio. Po meni je sporan nacin na koji se gleda na to sta je parametar.


Poz. Gosha
[ gosha @ 11.06.2008. 20:26 ] @
Vidim da je moje misljenje o pogledu na to sta je parametar suporotno od JAVA sveta pa cu ga ipak korigovati.

Izvinjavam se svima.

Poz. Gosha
[ Java Beograd @ 12.06.2008. 08:46 ] @
Kao što rekoh, u Javu ulete C++ developeri, zbunjeni svojom i java terminologijom, pa donesu haos svojim izjavama. (Uopšte ne želim da tvrdim da je nečija izjava tačna ili nije). Tako nam se javio i Dragi Tata, koji za sebe kaže da je pretežno C++ developer i lepo i konačno potvrdi "Ne vidim čemu rasprava: U Javi se sve prenosi po vrednosti."

Zato sebi dajem slobodu, da kao Java developer lepo i konaćno izjavim.

Ne vidim čemu rasprava: u Javi se primitive (int, float, char, byte, boolean ...) prenose po vrednosti, a objekti po referenci, što ima svojih dobrih strana a i loših.

Pozdrav.

[Ovu poruku je menjao Java Beograd dana 12.06.2008. u 10:35 GMT+1]
[ srki @ 12.06.2008. 09:39 ] @
Jeste da je ovde rec o javi ali nadam se da se neces ljutiti ako ubacim malo C# jer je u mnogim stvarima slican javi.

Ako imas ovakvu definiciju: StringBuilder o = new StringBuilder();
kako bi onda rekao da funkcija funkcija(StringBuilder o); prenosi parametre? To je ekvivalentno javi pa bi pretpostavljam rekao da prenosi po vrednosti. A kako bi onda rekao da funkcija funkcija(ref StringBuilder o); prenosi vrednosti?

Nadam se da ces iz ovog primera videti zasto gresis. Da li mislis da autor jave isto gresi kada kaze da se sve prenosi po vrednosti?

Citat:
Kao što rekoh, u Javu ulete C++ developeri, zbunjeni svojom i java terminologijom, pa donesu haos svojim izjavama.

Bezveze mi je stvarno da se u raspravu uplicu ad hominem napadi (koliki ti je programerski staz, u cemu programiras i sl.) ali ipak cu da pomenem da sam duzi niz godina pretezno Java developer tako da ovo uopste nema veze sa tim da li znam C++. Zbunjen nisam bio ni malo i ne smeta mi nista u obavljanju mog posla.

Ajde posto kazes da se objekti u Javi prenose po referenci, da li mozes u Javi da napises swap funkciju za stringove?
[ Java Beograd @ 12.06.2008. 10:29 ] @
String je immutabile
[ anon315 @ 12.06.2008. 10:47 ] @
Citat:
Java Beograd: String je immutabile


Upravo tako. A ako ste bas zapeli za swapom onda uradis ovako nesto:

Code:

public class MutableString {

    private String value;

    public MutableString(String value) {
       setValue(value);
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String toString() {
        return value;
    }

    public static void main(String[] args) {
        MutableString a = new MutableString("Ja sam A");
        MutableString b = new MutableString("Ja sam B");
        System.out.println("a: " + a);
        System.out.println("b: " + b);
        swap(a, b);
        System.out.println("a: " + a);
        System.out.println("b: " + b);
    }

    public static void swap(MutableString s1, MutableString s2) {
        String tmp = s1.getValue();
        s1.setValue(s2.getValue());
        s2.setValue(tmp);
    }

}
[ Java Beograd @ 12.06.2008. 10:55 ] @
<SARKAZAM>

MIRAKUL !

Vanja je opet napisao metodu koja menja objekat ! I time uneo dodatnu zabunu u diskusiju. Mnogi će se upecati !

</SARKAZAM>
[ anon315 @ 12.06.2008. 10:58 ] @
Vidis kako mi ide
[ hyle @ 12.06.2008. 11:02 ] @
Kada bi neki početnik pročitao ovu temu pomislio bi da se raspravlja o nekom teškom problemu, a ne o elementarnom konceptu.
Citat:
Java Beograd:u Javi se primitive (int, float, char, byte, boolean ...) prenose po vrednosti, a objekti po referenci


Vidi, ovde ti fali jedna reč u definiciji: ... a objekti po vrednosti reference.
Ukoliko parametar prenosiš po adresi onda je moguće da u metodi uradiš promenu vrednosti prosleđenog parametra. To u Javi nije moguće jer Java uvek prenosti parametre po vrednosti, bez obzira da li se radi o primitivi ili referenci. Nemoj molim te zbunjivati ljude sopstvenim tumačenjima, taj koncept prenošenja po vrednosti ili adresi je mnogo stariji od Jave.
[ Java Beograd @ 12.06.2008. 11:11 ] @
E pa upravo to i pišem, od početka. (Pročitaj osmi post na ovoj temi, pre 6 dana i 21h -u momentu pisanja ovog posta)

Thinking in Java

Dakle, razmišljati na Java jeziku. Jer, nikako drugačije u Javi ni ne može biti, nego "po vrednosti reference". Ali na Java jeziku, to se kaže "po referenci".
Ti pričaš na C jeziku, a ja na Java jeziku.



[ franticnick @ 12.06.2008. 11:26 ] @
Citat:
Java Beograd:
... Jer, nikako drugačije u Javi ni ne može biti, nego "po vrednosti reference". Ali na Java jeziku, to se kaže "po referenci".


Neobicno mi je drago da si konacno dosao do odgovora na "Da li se slazes da se reference u Javi uvek prenose by value?":

konacni zakljucak: u Javi se sve prenosi po vrednosti.
[ augustus @ 12.06.2008. 11:34 ] @
Mozda tvoj zakljucak...Java Beograd je to savrseno objasnio u prethodnom
postu.
[ hyle @ 12.06.2008. 11:35 ] @
Vidi ovako, metoda može primati kao parametar reference (ili pointere u nekom drugom jeziku), a da se ipak ne radi o prenošenju parametara po adresi.

Suština prenošenja parametara po adresi nije u tipu parametra, već u tome što se promene vrednosti parametra u toku izvršenja metode vide i po završetku izvršavanja metode, tj. metoda može promeni vrednost parametara koji su prosleđeni po adresi. Tako nešto nije moguće izvesti u Javi.
[ franticnick @ 12.06.2008. 11:37 ] @
Citat:

Mozda tvoj zakljucak...Java Beograd je to savrseno objasnio u prethodnom
postu.


Dobro onda zakljucak za one koji razumeju samo jezik kojim govori "Java Beograd"

Citat:
Java Beograd
Jer, nikako drugačije u Javi ni ne može biti, nego "po vrednosti reference".
[ srki @ 12.06.2008. 11:42 ] @
Citat:
Java Beograd: String je immutabile

Nema to veze, u C#u mozes da napravis funkciju koja ce da zameni immutable objekte zato sto tu mozes da napravis funkciju koja prosledjuje parametre po referenci. Ajde odgovori na ono pitanje o funkcijama iz moje prethodne poruke? Kako bi rekao da se prenose parametri u slucaju da je funkcija definisana sa funkcija(Object o) a kako kada je definisana sa funkcija(ref Object o) ? Problem sa Vanjinim resenjem je sto je ta funkcija onda vezana za specificnu klasu i nece raditi ako pasujes objekte koji su izvedeni od te klase. Znaci ne mozes da napravis funkciju koja ce da swapuje dva proizvoljna objekta. To znaci java ne pasuje po referenci vec po vrednosti. Verovatno tvorac jave nema dovoljno staza kad tvrdi suprotno.
[ staticInt @ 12.06.2008. 11:44 ] @
Ako bas hocete da upotrebite rec pointer i javu u istoj recenici onda probajte da zamislite da je u javi svaki objekat pointer za sebe.
[ Java Beograd @ 12.06.2008. 12:09 ] @
Citat:
srki: Nema to veze, u C#u mozes da napravis funkciju ...


U C-u su funkcije, u Javi su metode.

Jebote, stvarno mi nije jasno šta vi pokušavate ?! Uporno, uporno i uporno pojmove i termine Java jezika vezujete i upoređujete sa pojmovima i feature-ima iz C, C++, C# !

ALO ! ALO ! ALO ! OVDE PLANETA ZEMLJA ! OVO JE TEMA ZA REFERENCE U JAVI NA JAVA FORUMU !

Dosta bre sa tom veštačkom i neprimenjivom analogijom.


[ srki @ 12.06.2008. 12:15 ] @
Ok, i u C# su metodi i metod(Object o) radi isto sto bi radio i u Javi tj. na isti nacin pasuje parametre. Ajde odgovori koji je to nacin? A sta ako napisem metod(ref Object o) , koji je to nacin? Ne znam sto izbegavas da das odgovor na pitanje o tome da li autor jave gresi? On nije napisao ono u knjizi o specifikaciji Jave vec bas u knizi za ucenje Jave.

[Ovu poruku je menjao srki dana 12.06.2008. u 13:27 GMT+1]
[ srki @ 12.06.2008. 12:26 ] @
Zanimljivi clanci:
http://www.yoda.arachsys.com/java/passing.html
Citat:
Parameter passing in Java - by reference or by value?
This is another common question on Java newsgroups, made worse by the fact that people who should know better still perpetuate the following myth:

Myth: "Objects are passed by reference, primitives are passed by value"

Some proponents of this then say, "Ah, except for immutable objects which are passed by value [etc]" which introduces loads of rules without really tackling how Java works. Fortunately the truth is much simpler:

Truth #1: Everything in Java is passed by value. Objects, however, are never passed at all.

That needs some explanation - after all, if we can't pass objects, how can we do any work? The answer is that we pass references to objects.



http://www.javaranch.com/campfire/StoryPassBy.jsp
Citat:
Way too many people say "Java passes primitive by value and objects by reference". This is not the way it should be stated. Java passes everything by value. With primitives, you get a copy of the contents. With references you get a copy of the contents.

But what is the contents of a reference?

The remote control. The means to control / access the object.


http://www.javaworld.com/javaw...a/2000-05/03-qa-0526-pass.html
Citat:
Java does manipulate objects by reference, and all object variables are references. However, Java doesn't pass method arguments by reference; it passes them by value.


Znaci Java je ista kao i C, sve se pasuje by value. Ti imas pointere u Javi jer da nije tako onda ne bi imao izuzetak NullPointerException, zar ne? Zasto bi se inace tako zvao?

Understanding that parameters are passed by value and not by reference

[Ovu poruku je menjao srki dana 12.06.2008. u 13:38 GMT+1]
[ anon315 @ 12.06.2008. 12:53 ] @
Mod, lockuj ovo, ovde se svi razumeju, ali ne pricaju istim jezikom :)
[ Dragi Tata @ 12.06.2008. 14:44 ] @
@Java Beograd:

Ja stvarno ne znam zašto si toliko zapenio. Pričaš očigledno netačne stvari i možeš da pišeš sve poruke velikim slovima ako ti se dopada, i dalje je činjenica da Java prenosi sve parametre metoda po vrednosti.

Ajd' u zdravlje i manje nerviranja :)

@Vanja: dobar ti taj swap, hehehe

[ staticInt @ 12.06.2008. 15:30 ] @
Citat:
Vanja Petreski: Mod, lockuj ovo, ovde se svi razumeju, ali ne pricaju istim jezikom :)


So true :)
[ anon315 @ 12.06.2008. 15:35 ] @
Citat:
Dragi Tata: @Vanja: dobar ti taj swap, hehehe


Jbg, a jos kad bi radio autoboxing, gde bi nam kraj bio