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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

selamVer() yordamı çağrılacaktı fakat Er sınıfının içerisinde, ana sınıfa ait olan (Asker sınıfı)<br />

selamVer() yordamı iptal edildiğinden (override) dolayı, <strong>Java</strong>, Er nesnesinin selamVer() yordamını<br />

çağırılacaktır. Peki hangi nesnesinin selamVer() yordamının çağrılacağı ne zaman belli olur? Derleme<br />

anında mı (compile-time)? Yoksa çalıĢma anında mı (run-time)? Cevap; çalıĢma anında (run-time). Bunun<br />

sebebi, derleme anında hazirOl() yordamına hangi tür nesneye ait referansın gönderileceğinin belli<br />

olmamasıdır. ()<br />

Son olarak, Yuzbasi nesnesine bağlı Yuzbasi tipindeki referansımızı hazirOl() yordamına parametre<br />

olarak gönderiyoruz. Artık bu bize ĢaĢırtıcı gelmiyor... devam ediyoruz. Peki Ģimdi hangi nesneye ait<br />

selamVer() yordamı çağrılır? Asker nesnesinin mi? Yoksa Yuzbasi nesnesinin mi? Cevap Yuzbasi<br />

nesnesine ait olan selamVer() yordamının çağrılacağıdır çünkü Asker tipindeki yerel değiĢkenimiz heap<br />

alanındaki Yuzbasi nesnesine bağlıdır ve selamVer() yordamı Yuzbasi sınıfının içerisinde iptal<br />

edilmiĢtir (override). Eğer selamVer() yordamı Yuzbasi sınıfının içerisinde iptal edilmeseydi o zaman<br />

Asker sınıfına ait (ana sınıf) selamVer() yordamı çağrılacaktı. Aynı Ģekilde <strong>Java</strong> hangi nesnenin<br />

selamVer() yordamının çağrılacağına çalıĢma-anında (run-time) da karar verecektir yani geç bağlama<br />

özelliği devreye girmiĢ olacaktır. Eğer bir yordamın hangi nesneye ait olduğu çalıĢma anında belli oluyorsa<br />

bu olaya geç bağlama (late-binding) denir. Bu olayın tam tersi ise erken bağlamadır (early binding); yani,<br />

hangi nesnenin hangi yordamının çağrılacağı derleme anında bilinmesi. Bu örneğimiz çok fazla basit<br />

olduğu için, "Niye ! derleme anında hangi sınıf tipindeki referansın hazirOl() yordamına paslandığını<br />

bilemeyelim ki, çok kolay, önce Asker sınıfına ait bir referans sonra Er sınıfına ait bir referans ve en son<br />

olarak da Yuzbasi sınıfına ait bir referans bu yordama parametre olarak gönderiliyor iĢte..." diyebilirsiniz<br />

ama aĢağıdaki örneğimiz için aynı Ģeyi söylemeniz bu kadar kolay olmayacaktır ()<br />

Örnek: PolimorfizmOrnekIki.java ()<br />

class Hayvan {<br />

public void avYakala() {<br />

System.out.println("Hayvan avYakala");<br />

}<br />

}<br />

class Kartal extends Hayvan {<br />

public void avYakala() {<br />

System.out.println("Kartal avYakala");<br />

}<br />

}<br />

class Timsah extends Hayvan{<br />

public void avYakala() {<br />

System.out.println("Timsah avYakala");<br />

}<br />

}<br />

public class PolimorfizmOrnekIki {<br />

public static Hayvan rasgeleSec() {<br />

int sec = ( (int) (Math.random() *3) ) ;<br />

Hayvan h = null ;<br />

if (sec == 0) h = new Hayvan();<br />

if (sec == 1) h = new Kartal();<br />

if (sec == 2) h = new Timsah();<br />

return h;<br />

}<br />

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

Hayvan[] h = new Hayvan[3];<br />

138

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

Saved successfully!

Ooh no, something went wrong!