|
Bildirim
|
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. |
Hocam bu sinirin kaynağı nedir ?
Mephalay başka konularda da okuyorum güzel açıklamalar yapıyorsunuz, elinize sağlık. |
|
|
|
|
< 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 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 |