Şimdi Ara

Pass by Reference ve Pass by Value'üyü anlamadım yardım ?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
3 Misafir - 3 Masaüstü
5 sn
8
Cevap
1
Favori
3.120
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • https://www.youtube.com/watch?v=AMiE3kZ_krI&index=3&list=PLch06UN-8SZmcIDAxeM_gGFtnjy8QIXSR#t=1.33921 burada Pass by Reference ve Pass by Value anlatımı var ama ben bir kaç izleyip inernetten de araştırmama rağmen anlamadım, Pass by Reference ve Pass by Value'üyü basitçe(yani olabildiğince terimlerden arındırarak) ve uzunca(yani açıklayıcı olarak) ne olduklarını yazabilir misiniz ?



  • int sayi = 8;
    Yazdigin zaman memory de 8 degeri tutulur. sayi ismindeki int, aslinda 8 degildir, memory deki 8 adresini gosteren bir pointer'dir. ( referans demiyorum kafa karisikligi olmasin diye )
    Sen bir metoda hesapla(sayi) diyerek bu sayi parametresini verdigin zaman, memory'deki 8'i gosteren "sayi" ismindeki pointer bu metodun scope u icerisinde erisilebilir olur.
    Sen bu scope icerisinde sayi = 12; yaparsan, memory de 12 ye yer acilir ve artik senin scope'undaki 2. pointer 12 yi adresler. Fakat ilk basta kullandigimiz pointer hala 8 i gostermektedir. Bu yuzden metod isini bitirdiginde deger degismez.

    Eger sayi.azalt() gibi bir metod olsa idi ve sen hesapla metodunun icerisinde bunu yapsa idin, farkli pointerlar ayni adresteki objeye erisebildiklerinden, 8'i gosteren adres uzerinden azalt() cagirilacakti ve boylelikle deger degisecekti. Bunun adinin pass-by-value olmasinin sebebi, pratikte senin metoda objenin "degeri" geliyormus gibi hesap yapmandan, objenin sana parametre veren bir onceki scope'daki degerindeki referansini degistirememenden kaynaklaniyor.

    Yani, memory de 8 dururken sen bir metoda hesapla(sayi) olarak bu parametreyi pass edersen, 8 degerinde yeni bir value olusturulmaz. Sadece senin metod scope un icerisinde 8 i gosteren bir pointer in olur. Bu pointer ile erisebildigin degeri degistirebilir ya da baska bir degere assign edebilirsin. ( Baska bir degere assign edince yeni bir pointer olusur )

    ---------------

    Pass by reference yonteminde, farkli bir degere assign ettiginde artik benim sana verdigim pointer in baktigi adresi degistirmis olursun. Ben de artik 8 yerine 12 yi gorurum.

    -------------

    Bunu bir de adres bulma analojisinden izah edebilirim. Ornegin sana bir kagit verdim, kagitta evimin adresi yaziyor.
    Sen bu kagidin uzerindeki adresi silip, yerine baska bir evin adresini yazarsan:
    - Bu kagida bakarak benim evin adresini bulmak isteyen tum insanlar artik yeni evin adresini gorurler. Cunku sen direkt olarak referansi degistirdin.
    - Benim adresimin bulundugu kagidin sana sadece bir kopyasini verdim, sen ona istedigini yaz. Sadece kendi baktigin adresi degistirirsin, diger herkes ayni sekilde benim evimin adresini okumaya devam ederler. ---> Pass by value budur.

    Eger sen evin icerisinde bir sey degistirmek istersen, adresteki evi bulup, icerisinde istedigin degisikligi yapabilirsin. Ama sana verdigim kagida ne yazarsan yaz, diger insanlarin referansi uzerinde degisiklik yapamadigin icin senin disindaki insanlar ( scope disindakiler ) etkilenmezler.

    ---

    Bu iki yontemin avantaji da, dez avantaji da var. Java bu sekilde yapmis. Javada pointer yok diyenler de genelde ironik sekilde yaniliyorlar. Aslinda int i = 3; dedigin zaman "i" bir pointer yalnizca. Sadece C++ ta oldugu gibi ampersand kullanip referans modifikasyonu yapamiyorsun. Yani Java 'da hic bir sekilde int sayi = 5; dedikten sonra degistir(sayi); metodunu cagirarak sayi ' nin degerini degistiremezsin.

    Java tamamen pass-by-value dur.
  • Pass by Value : Fonksiyona parametre gönderdiğinde , parametre başka adrese kopyalanır . Mesela
    func(deg1); diye fonksiyonu çağırdın , deg1'in gösterdiği adres A olsun
    func(int deg_2){
    bu fonksiyonda ise gelen parametre kopyalanır ve deg_2 başka adresi yani B'yi gösterir
    Yani sen B adresindeki değeri değiştirsende , A daki adres içindeki değer etkilenmeyeceğinden , buna pass by value denir
    }


    pass by reference:
    int deg1= new int();
    func(deg1); diye fonksiyonu çağırdın , deg1'in gösterdiği adres A olsun

    func(int deg_2){
    bu sefer bu fonksiyona deg1'in referansını gönderirsin, yani adresini.
    Yani bu fonksiyon içindeki deg_2 , aslında deg1'in adresini gösterir.Yani deg_2 için yapacağın değişiklikler deg1'ide etkiler.Sonuçta ikiside aynı yeri gösteriyorlar.
    }
  • seyfi84 S kullanıcısına yanıt
    kim korkak ki java'dan adlı kitapta da sadece pass by referance var pas by value yok :D
  • seyfi84 S kullanıcısına yanıt
    o zman ben ingilizce çalışma saatimi 4 saate çıkarıyorum :D şimdilik türkçe kaynaklardan idare etmem lazım ama haklısın ingilizce şart ve türkçe kaynaklarda yetersiz.
  • seyfi84 S kullanıcısına yanıt
    Merhaba,

    Video'yu çeken nerzid benim. Bir arkadaş buraya bakmamı istemiş ben de cevap yazıyorum merak edenler için.

    Öncelikle ben pass-by-refence olayının JAVA'da olmadığını bilmiyordum fakat bu karışıklığın neden olduğuyla ilgili şu stackoverflow sayfasında çok güzel cevaplar mevcut.

    http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value

    Özellikle şu 2 yorumu ingilizceniz varsa okuyabilirsiniz. Kafa karışıklığının sebebini çok güzel açıklamlışlar.

    1-) "When an object reference is passed to a method, the reference itself is passed by use of call-by-value. However, since the value being passed refers to an object, the copy of that value will still refer to the same object referred to by its corresponding argument."

    2-) "I believe that much of the confusion on this issue has to do with the fact that different people have different definitions of the term "reference". People coming from a C++ background assume that "reference" must mean what it meant in C++, people from a C background assume "reference" must be the same as "pointer" in their language, and so on. Whether it's correct to say that Java passes by reference really depends on what's meant by "reference""


    Buna rağmen, benim videoda anlattığım şekilde öğrenirsen, bu senin programlamanda bir sıkıntı yaratmayacaktır. Hatta bu javadan bahsederken pass by reference da vardır dersen hiç bir problem değil. Neden mi ? Yukarıda yazdığım 1. madde de bunun cevabını söylüyor, evet JAVA kesinlikle pass-by-value bir dil fakat referanslara olan davranışı asıl kafa karışıklığını oluşturan şey oluyor.


    Programlamaya yeni başlayıp da seyfi84 adlı egoist imparatorun yazdığı mesajlara bakıp morali bozulan arkadaşlarımız için yazıyorum bunu, moralinizi bozmayın, canınızı sıkmayın. Seyfi84'ün millete laf sokarak sen salaksın o salak hepiniz salak bi ben akıllıyım bu dünyada diye bahsettiği bu konu, tüm dünyada insanların kafasını karıştıran FAKAT programlamasını etkilemeyen bir konu.




  • deniz caliskan kullanıcısına yanıt
    int sayi = 8;
    Yazdigin zaman memory de 8 degeri tutulur. sayi ismindeki int, aslinda 8 degildir, memory deki 8 adresini gosteren bir pointer'dir. ( referans demiyorum kafa karisikligi olmasin diye )
    Sen bir metoda hesapla(sayi) diyerek bu sayi parametresini verdigin zaman, memory'deki 8'i gosteren "sayi" ismindeki pointer bu metodun scope u icerisinde erisilebilir olur.
    Sen bu scope icerisinde sayi = 12; yaparsan, memory de 12 ye yer acilir ve artik senin scope'undaki 2. pointer 12 yi adresler. Fakat ilk basta kullandigimiz pointer hala 8 i gostermektedir. Bu yuzden metod isini bitirdiginde deger degismez.

    Eger sayi.azalt() gibi bir metod olsa idi ve sen hesapla metodunun icerisinde bunu yapsa idin, farkli pointerlar ayni adresteki objeye erisebildiklerinden, 8'i gosteren adres uzerinden azalt() cagirilacakti ve boylelikle deger degisecekti. Bunun adinin pass-by-value olmasinin sebebi, pratikte senin metoda objenin "degeri" geliyormus gibi hesap yapmandan, objenin sana parametre veren bir onceki scope'daki degerindeki referansini degistirememenden kaynaklaniyor.

    Yani, memory de 8 dururken sen bir metoda hesapla(sayi) olarak bu parametreyi pass edersen, 8 degerinde yeni bir value olusturulmaz. Sadece senin metod scope un icerisinde 8 i gosteren bir pointer in olur. Bu pointer ile erisebildigin degeri degistirebilir ya da baska bir degere assign edebilirsin. ( Baska bir degere assign edince yeni bir pointer olusur )

    ---------------

    Pass by reference yonteminde, farkli bir degere assign ettiginde artik benim sana verdigim pointer in baktigi adresi degistirmis olursun. Ben de artik 8 yerine 12 yi gorurum.

    -------------

    Bunu bir de adres bulma analojisinden izah edebilirim. Ornegin sana bir kagit verdim, kagitta evimin adresi yaziyor.
    Sen bu kagidin uzerindeki adresi silip, yerine baska bir evin adresini yazarsan:
    - Bu kagida bakarak benim evin adresini bulmak isteyen tum insanlar artik yeni evin adresini gorurler. Cunku sen direkt olarak referansi degistirdin.
    - Benim adresimin bulundugu kagidin sana sadece bir kopyasini verdim, sen ona istedigini yaz. Sadece kendi baktigin adresi degistirirsin, diger herkes ayni sekilde benim evimin adresini okumaya devam ederler. ---> Pass by value budur.

    Eger sen evin icerisinde bir sey degistirmek istersen, adresteki evi bulup, icerisinde istedigin degisikligi yapabilirsin. Ama sana verdigim kagida ne yazarsan yaz, diger insanlarin referansi uzerinde degisiklik yapamadigin icin senin disindaki insanlar ( scope disindakiler ) etkilenmezler.

    ---

    Bu iki yontemin avantaji da, dez avantaji da var. Java bu sekilde yapmis. Javada pointer yok diyenler de genelde ironik sekilde yaniliyorlar. Aslinda int i = 3; dedigin zaman "i" bir pointer yalnizca. Sadece C++ ta oldugu gibi ampersand kullanip referans modifikasyonu yapamiyorsun. Yani Java 'da hic bir sekilde int sayi = 5; dedikten sonra degistir(sayi); metodunu cagirarak sayi ' nin degerini degistiremezsin.

    Java tamamen pass-by-value dur.



    < Bu mesaj bu kişi tarafından değiştirildi Mephalay -- 23 Ocak 2017; 1:55:21 >
    < Bu ileti tablet sürüm kullanılarak atıldı >




  • Hocam bu sinirin kaynağı nedir ?
    Mephalay başka konularda da okuyorum güzel açıklamalar yapıyorsunuz, elinize sağlık.
  • Mephalay M kullanıcısına yanıt

    Hocam merhabalar, bircok yerde konu ile ilgili anlatimlarinizi cok sevdim. Sizden bir konu hakkinda bilgi almak isterdim.Aceba nasil iletiwime gecebilirim sizinle.Cevaplarsaniz cok mutlu olurum,onemli benim icin

  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.