ftpyt, mesajından alıntı:
Benim dikkatimi çeken nokta,pointer c dilinde çok etkin bir rol oynuyor.Her alanda.
Onun nedeni, "referans" kavramının çoğu dilde çok etkin bir rol oynamasıdır. Örneğin C gibi dillerde verilen sayının kendisini yarıya bölen bir işlev şöyle yazılabilir:
Kod:
void ikiye_bol(int * sayi)
{
*sayi /= 2;
}
int main()
{
int sayi = 42;
ikiye_bol(&sayi);
}
Ben pointer mekanizmasını anlamama rağmen,örnek uygulamalar beni sürekli afallatıyor.Mesela bir örnek;fonksiyonlarda Referans ile aktarımda önce pointer değişken tanımlanıyor,sonra aktarım yapılacak arguman değişkenin adresi vasıtasıyla aktarım yapıyor.(Umarım yanlış bir tanımlama yapmamışımdır)
Yukarıdaki kullanımda da görüldüğü gibi aslında ayrıca işaretçi tanımlamaya gerek yok. Ama dediğin genelde tabii ki doğru.
Şimdi Javaya geçsek bildiğim kadarıyla pointer olayı yok
Ama "referans" kavramı bütünüyle olayın içinde. Hatta o kadar içinde ki, sanırım zaten herşey referans. Özellikle * gibi özel bir karakter kullanılmadığı için Java'da referans olmadığını sanıyoruz ve ama herşey zaten referans.
Ara not: D dili de Java gibi dillerin yolundan gitmiş ve * karakterini gereksiz hale getirmiş. (Yine de kullanılabiliyor ama çoğu durumda gerek olmuyor.) Örneğin yukarıdaki kod D'de şöyle yazılırdı:
Kod:
void ikiye_bol(ref int sayi)
{
sayi /= 2;
}
void main()
{
int sayi = 42;
ikiye_bol(sayi);
}
Yani aynı Java gibi... Hatta, yine aynen Java'da olduğu gibi, bütün sınıf türleri de referans türü oluyorlar. Orada da ne * gerekiyor, ne de üyelere -> karakterleriyle özel erişim:
Kod:
auto dosya = new File("deneme", FileMode.Out);
dosya.writeln(42);
Orada 'File' bir sınıf, ve 'dosya' bir sınıf nesnesi. new bir nesne adresi döndürse de, ve 'dosya' perde arkasında bir işaretçi olsa da, Java'da olduğu gibi normal bir nesne gibi kullanıyoruz.
Bunları "her alanda olan şey"in aslında referans kavramı olduğunu belirtmek için söyledim. Çoğu dilde var... C'ninki tarihsel nedenlerle *, &, ve -> yazımlarıyla açık açık yazılacak şekilde tasarlanmış.
"İşlevsel programlama" (functional programming) gibi, içinde hiç referans kavramı olmayan diller de var. Öyle bazı dillerde verilerin doğrudan değiştirilmesine izin verilmez. Verilen ancak atama yoluyla değiştirilebilirler. Öyle bir dilde, yukarıdaki kodu aşağıdaki gibi yazmak gerekirdi.
Yine C dilini kullanarak ama işlevsel programlama mantığı ile yazarak:
Kod:
int ikiye_bol(int sayi)
{
return sayi / 2;
}
int main()
{
int sayi = 42;
sayi = ikiye_bol(sayi);
}
İşte öyle dillerde referans kavramı yoktur. Ama Java'da var... 
Ali
Bookmarks