Javada referans değişkenlerinin dönüştürülmesi(Referance Variables Casting)
Herkese merhabalar,
Bu yazımızda referans değişkenlerin dönüşümünden(cast edilmesi) bahsedeceğiz.
Spesifik nesne türlerine ulaşmak için genel referans değişken türlerini kullanmak yaygındır. Bu object oriented mantığında mümkündür ve polimorfizm(çok biçimlilik) olarak adlandırılır. Örneğin,
Hayvan hayvan = new Kopek();
Yukarıda verilen kodda hayvan nesnesi ile çağırılacak metot hem Kopek classında hem de Hayvan classında yer alır. Bu bir polimorfizm örneğidir. Ancak, yalnızca Dog sınıfının sahip olduğu bir metotu çağırmak için bu hayvan referans değişkenini kullanmak istediğinizde ne olur?
class Hayvan {
void gurultuYap() {System.out.println(“gürültü yapan hayvan.”); }
}
class Kopek extends Hayvan {
void gurultuYap() {System.out.println(“HAV HAV HAV “); }
void hirla() { System.out.println(“hırrrrrrr”); }
}
class CastTest1 {
public static void main(String [] args) {
Hayvan [] a = {new Hayvan (), new Kopek(), new Hayvan () };
for(Hayvan hyvn : a) {
hyvn.gurultuYap();
if(hyvn instanceof Kopek) {
hyvn.hirla(); // Kopek classındaki hirla() metoduna erişmeye çalışıyor ?
} } } }
Yukarıdaki kodu derlediğimizde compiler hatası alırız .
(Cannot find symbol). Compiler bize Hayvan classında hirla() metodunun olmadığını söyleyecektir. Ancak kodu aşğaıdaki gibi düzeltirsek derleyici bize hata vermez,(downcasting)
if(hyvn instanceof Kopek) {
Kopek d = (Kopek) hyvn; // hyvn değişkeni Kopek türüne dönüştürülür.
d.hirla()();
}
Burada Kopek classından bir nesne oluştururken Hayvan classından oluşturduğumuz hyvn türünü cast etmiş oluyoruz. Bu sayede diğer metotları da çağırabiliriz.
Şimdi aşağıda yer alan cast yapısını inceleyelim:
class Hayvan { }
class Kopek extends Hayvan { }
class KopekTest {
public static void main(String [] args) {
Hayvan hayvan = new Hayvan ();
Kopek d = (Kopek) hayvan; // compile edilir fakat sonrasında hata verir.
}
}
Derleyicinin yapabileceği tek şey, iki türün aynı kalıtım ağacında olduğunu doğrulamaktır, böylece aşağı gönderimden önce hangi kodun gelmiş olabileceğine bağlı olarak, hayvanın Dog türünde olması gerekir.
Aşağıdaki kod bloğu ise derlenmeyecektir:
Hayvan hayvan = new Hayvan();
Kopek d = (Kopek) hayvan;
String s = (String) hayvan; // hayvan türü STRİNG olamaz.
Bu kod bloğu derlenmeye çalışılırsa inconvertible types hatası alacaktır.
Downcasting’den farklı olarak, upcasting (kalıtım ağacını daha genel bir türe çevirmek) örtük olarak çalışır (yani casti yazmanız gerekmez), çünkü upcasting yaptığınızda çağırabileceğiniz metotların sayısını dolaylı olarak kısıtlarsınız.
class Hayvan { }
class Kopek extends Hayvan { }
class KopekTest {
public static void main(String [] args) {
Kopek d = new Kopek ();
Hayvan a1 = d;
Hayvan a2 = (Hayvan) d;
}
}
Önceki güncellemelerin ikisi de istisnasız olarak derlenecek ve çalışacak, çünkü bir Kopek IS-A Hayvan, yani bir Hayvanın yapabileceği her şeyi, bir Kopeğin de yapabileceği anlamına gelir. Bir Kopek classı elbette daha fazlasını yapabilir, ancak mesele şu ki Hayvan referansı olan herkes bir Kopek örneğinde Hayvan metotlarını güvenle çağırabilir.
Yazımızdaki Kodlar ve daha fazlası sitemizde yeralmaktadır. http://latestsoftwaredevelopers.com/
Referanslar ile ilgili değişken türlerinin nasıl cast edildiğini örneklerle açıklamış olduk. Sorularınız için yorum yazmayı ve bizi takip etmeyi unutmayın. Bir sonraki yazımızda görüşmek üzere. İyi çalışmalar