06.03.2015 Views

Java Kitabı

JAva`nın çalışma mantığıyla başlayıp basitten gelişmişe iyi bir kaynak

JAva`nın çalışma mantığıyla başlayıp basitten gelişmişe iyi bir kaynak

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

}<br />

public static void main( String args[] ) {<br />

Futbolcu f = new Futbolcu();<br />

// Sporcu s = new Sporcu(); // ! Hata soyut sınıf !<br />

}<br />

Soyut sınıflara ait yapılandırıcılar olabilir. 5. bölümde de incelediği üzere, sınıflara ait nesneleri<br />

oluĢtururken iĢin içerisinde bir de kalıtım (inheritance) özelliği girdiğinde olayların nasıl değiĢtiği<br />

incelemiĢtik. Bir sınıfa ait nesne oluĢturulacaksa, önce bu sınıfın ana sınıfı var mı diye kontrol edilir; yani,<br />

bu sınıf türetilmiĢ bir sınıf mı kontrolü yapılır. Eğer bu sınıfın türetildiği ana bir sınıf var ise önce bu ana<br />

sınıfa ait nesne oluĢturulur daha sonra sıra türeyen sınıfımıza ait nesnenin oluĢturulmasına gelir. Yukarıdaki<br />

örneğimizde kalıtım kavramı kullanılmıĢtır. Ana sınıf Sporcu sınıfıdır, bu sınıftan türetilmiĢ olan ise<br />

Futbolcu sınıfıdır - Futbolcu bir Sporcudur. Biz Futbolcu sınıfına ait bir nesne oluĢturmak istersek, bu<br />

olayın daha öncesinde Sporcu sınıfına ait bir nesnesinin oluĢacağını açıktır. ()<br />

Bu örneğimizdeki akıl karıĢtırıcı nokta, soyut bir sınıfa ait yapılandırıcı içerisinden soyut bir yordamın<br />

çağrılıyor olmasıdır. Sporcu sınıfının yapılandırıcısına dikkat ederseniz, bu yapılandırıcı içerisinden soyut<br />

bir yordam olan calis() yordamı çağrılmıĢtır. calis() yordamı hangi amaçla soyut yapılmıĢ olabilir?<br />

Bu yordamın soyut yapılmasındaki tek amaç, alt sınıfların bu yordamı iptal etmelerini kesinleĢtirmek<br />

olabilir. Bu örneğimizdeki yanlıĢ, soyut bir sınıfa ait yapılandırıcının içerisinden soyut bir yordamın<br />

çağrılmasıdır. Peki böyle bir yanlıĢ yapıldığında nasıl sonuçlar oluĢur? Uygulamamızın çıktısı aĢağıdaki<br />

gibidir. ()<br />

calis() cagrilmadan evvel<br />

Futbolcu calis() 0 --> dikkat<br />

calis() cagrildiktan sonra<br />

Futbolcu yapilandirici<br />

Futbolcu calis() 4<br />

Uygulama çıktısındaki 2. satır çok ilginçtir. OluĢan olayları adım adım açıklarsak;<br />

1. Futbolcu sınıfına ait bir nesne oluĢturulmak istendi ama Futbolcu sınıfı Sporcu sınıfından<br />

türetildiği için, ilk önce Sporcu sınıfına ait yapılandırıcı cağrılacaktır. ()<br />

2. Sporcu sınıfına ait yapılandırıcının içerisinde soyut olan calis() yordamı çağrıldı. Soyut olan<br />

calis() yordamı Futbolcu sınıfının içerisinde iptal edildiği (override) için, Futbolcu sınıfına ait<br />

olan calis() yordamı çağrılacaktır fakat temel (primitive) int tipinde<br />

olan antreman_sayisi alanına henüz ilk değeri atanmadığından, <strong>Java</strong> tarafından varsayılan<br />

değer (default value) olan 0 sayısı verilmiĢtir. Buradaki ilginç olan nokta Futbolcu sınıfının<br />

içerisindeki calis() yordamı, Futbolcu sınıfına ait yapılandırıcıdan bile önce çağrılmıĢ olmasıdır (-<br />

ki bu istenmeyen bir durumdur). ()<br />

3. Ana sınıf olan Sporcu sınıfına ait yapılandırıcının çalıĢması sona erdikten sonra türemiĢ sınıf<br />

olan Futbolcu nesnesine ait global alan olan antreman_sayisi alanının ilk değeri<br />

verilmiĢtir. ()<br />

4. En son olarak Futbolcu sınıfına ait yapılandırıcı içerisindeki kodlar çalıĢtırılarak iĢlem sona erer.<br />

()<br />

6.8. Kalıtım ve Yukarı Çevirim (Upcasting)<br />

Yukarı çevirim (upcasting) her zaman güvenlidir, sonuçta daha özellikli bir tipten daha genel bir tipe doğru<br />

çevirim gerçekleĢmiĢtir. Örneğin elimizde iki tip televizyon bulunsun, biri Xmodel televizyon diğeri<br />

Xmodel'den türetilmiĢ ve daha yeni özelliklere sahip olan Ymodel televizyon. Bu iliĢkiyi UML<br />

diyagramında gösterirsek. ()<br />

153

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!