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.
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. }
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.
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.
Ö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.
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 >
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
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...
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.
Mephalay başka konularda da okuyorum güzel açıklamalar yapıyorsunuz, elinize sağlık.
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.
}
Bu mesajda bahsedilenler: @seyfi84
Bu mesajda bahsedilenler: @seyfi84
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.
Bu mesajda bahsedilenler: @seyfi84
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ı > Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesajda bahsedilenler: @deniz caliskan
Mephalay başka konularda da okuyorum güzel açıklamalar yapıyorsunuz, elinize sağlık.
Bu mesajda bahsedilenler: @seyfi84 , @Mephalay
Bu mesajda bahsedilenler: @Mephalay