Java 01 Kas 2008 20:50
Java Metotlarına Değer Geçmek
Java'da metotlara değer geçerken çok dikkat edilmesi gerekiyor. Bazen çok iyi bildiğinizi sandığınız bir konuda bile ince bir ayrıntıyı kaçırmak tüm programı yanlış yorumlamanıza neden olabilir. Şimdi sizi Java'nın ince bir ayrıntısıyla başbaşa bırakıyorum.
Kodları test edebilmek için bilgisayarınızda JDK kurulu olduğundan emin olun. "O da ne?" diyorsanız şurayı inceledikten sonra gelin.
Alttaki kodu Test.java ismiyle kaydedin.
Çıktının ne olması gerektiğini düşünün ve bir kağıda not edin.
Daha sonra Komut İstemi'ni açarak java kaynak dosyasını kaydettiğiniz dizine gidin.
Burada javac Test.java yazıp Enter'a basın.
Hatasız bir şekilde derlenirse aynı dizinde java Test yazıp Enter'a basın.
Çıktı tahmin ettiğiniz gibiyse problem yok.
Şimdi üstteki kod için yaptıklarımızı Test2 için de yapalım. Bu sefer Test yerine Test2 yazmayı unutmayalım. Ekran çıktısı tahmin ettiğiniz gibi mi oldu?
Eğer yukarıdaki kodları derleyip çalıştırdınız ve tahmin ettiğiniz sonuçları aldıysanız, size söyleyecek birşeyim yok. Ama Test sınıfınının bulunduğu örneğin 3,1 çıktısını, Test2 sınıfını kullanan örneğin 1,3 çıktısını vereceğini tahmin edemediyseniz bunun anlamı Java'da metotlara değer geçilmesi konusunda bilgileriniz tam oturmamış demektir. Şimdi bu bilgileri güncelleyelim:
Eğer İngilizce biliyorsanız buraya tıklayarak "Passing Primitive Data Type Arguments" ve "Passing Reference Data Type Arguments" başlıklarını okuyabilirsiniz.
Bu başlıklarda özetle şunu diyor: int, double gibi java ilkelleri metotlara argüman olarak geçildiğinde değerle geçilir (pass-by-value). Türkçe'ye çevirince garip olduğunun farkındayım, ama "değerle geçmek"ten kastım geçilen değere yapılan her değişiklik o metodun çerçevesinde kalır. Metot geri döndüğünde tüm parametreler kaybolur ve yapılan değişiklikler yok olur. Referans veri tipleri de -örneğin nesneler- metotlara değerle geçilir (pass-by-value). Bunun anlamı metot geri döndüğünde, geçilen referans daha önceki aynı nesneyi gösterir. Ancak, eğer uygun erişim iznimiz varsa nesnenin alanları metot içerisinde değiştirilebilinir. Bağlantıdaki örnekleri inceleyerek daha iyi anlayabilirsiniz.
Test ve Test2 örneklerimizde durum açıkça görülebilmektedir.
Test sınıfının m1() metodunu inceleyecek olursak burada yapılan değiş-tokuş (swap) işlemi sırasında kullanılan değiş-tokuş değişkeni bir java ilkeli olan int'tir. Bütün değiş-tokuş işlemleri boyunca dizilere referans verilmiş oluyor ve değişiklikler main() metodunda tanımlanmış dizi üzerinde yapılmış oluyor.
Test2 sınıfının m1() metodunda ise değiş-tokuş işlemi için dizi kullanılmıştır. Dizi kullanılarak yapılan değişiklikler m1() metodunun içinde kalmış ve main() içindeki dizi değişkenlerini değiştirmemiştir. Çünkü atama operatörleri nesne üzerinde değişiklikler yapılmasına değil, yeni dizi nesneleri oluşturulmasına neden olmuştur. Sonuçta metot sonlanıp tekrar main() metoduna dönüldüğünde elimizde eski nesnelerimiz el değmemiş şekilde bizi bekliyor olacaklar.
