2. Bölüm Çok Şekillilik (Polymorphism) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

Benzer belgeler
3. Bölüm Soyut Sınıflar (Abstract Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

5. Bölüm Alt Sınıflar (Nested Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

NESNEYE YÖNELİK PROGRAMLAMA

BİL-141 Bilgisayar Programlama I (Java)

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Polimorfizm. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 1

public static int Toplam int x, int y

Nesne Yönelimli Programlama

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 7

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

Sunum İçeriği. Programlamaya Giriş

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

C++ Dersi: Nesne Tabanlı Programlama

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

BİL-142 Bilgisayar Programlama II

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Bölüm 12. Nesne yönelimli programlama desteği

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

Lambda İfadeleri (Lambda Expressions)

Kalıtım (Inheritance)

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

Kapsülleme ( Encapsulation ) BBS-515 Nesneye Yönelik Programlama

Java ile Nesne Merkezli ve Fonksiyonel Programlama

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

Ders 8 Konu Özeti ve Problemler

Sınıfların Tekrardan Kullanılması. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 5 1

Java Class Yapısında Finalize Metotunun Kullanımı

İki Yöntem. Komposizyon (Composition) Kalıtım (Inheritance)

Eclipse, Nesneler ve Java 2 Java Nereden Çıktı? 2

Arayüz (Interface) Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 1

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

Java Programlamada Paket Yapısı Ve Import

Lecture 11: Generics

Java 2 Standart Edition SDK Kurulum ve Java ya Giriş

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

4.Hafta. this Anahtar Sözcüğü

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

Nesne Yönelimli Programlama

POLIMORFIZM. Java ve Yazılım Tasarımı ; Bölüm- 6. Örnek: PolimorfizmOrnekBir.java (yorum ekle)

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Erişim konusunda iki taraf vardır:

Nesne Yönelimli Programlama ve Kalıtım

4. Bölüm Arayüzler (Interfaces) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

YZM 2105 Nesneye Yönelik Programlama

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

HSancak Nesne Tabanlı Programlama I Ders Notları

Operator Aşırı Yükleme (Operator OverLoading)

MOBIL UYGULAMA GELIŞTIRME

Bölüm 11. Soyut veri tipleri ve kapsülleme kavramları ISBN

Üst Düzey Programlama

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 12: Grafik Kullanıcı Arayüzü (Graphical User Interface-GUI)

Dizi ( Array ) ve Dizgi ( String )

MALTEPE ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ YAZILIM MÜHENDİSLİĞİ LİSANS PROGRAMI

PAKET ERİŞİMLERİ SINIFLARIN YENİDEN KULLANIMI. BMU-112 Algoritma ve Programlama-II Yrd. Doç.Dr. İlhan AYDIN

Pointers (İşaretçiler)

Görsel Programlama DERS 01. Görsel Programlama - Ders01/ 1

// hataları işaret eden referans

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2

Hata Ayıklamanın Ötesi... (Assertion) Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 14 1

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

NESNEYE YÖNELİK PROGRAMLAMA

YZM 2105 Nesneye Yönelik Programlama

HSancak Nesne Tabanlı Programlama I Ders Notları

Java Dersi. Altuğ Bilgin Altıntaş

JAVADA METOTLAR. BMÜ-111 Algoritma ve Programlama. Yrd. Doç. Dr. İlhan AYDIN

ÜNİTE. NESNE TABANLI PROGRAMLAMA I Okt. Mustafa AKBUĞA İÇİNDEKİLER HEDEFLER METOTLAR

ENF102 TEMEL BİLGİSAYAR BİLİMLERİ VE C/ C++ PROGRAMLAMA DİLİ. Gazi Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

7. Bölüm Sıra Dışı Durum Yönetimi (Exception Handling) Java ile Nesne Merkezli ve Fonksiyonel Programlama

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir.

Java da, tüm değişkenlerin kullanılmadan önce tanımlanması edilmesi gerekir. Bir değişken tanımlamanın temel gösterimi bu şekildedir:

İsimler ve Kapsam. 24 Şubat Programlama Dilleri - Pamukkale Üniversitesi 1

BİL-142 Bilgisayar Programlama II

C++ Dersi: Nesne Tabanlı Programlama

Nesneye Dayalı Programlama

BİL132 Bilgisayar Programlama II

DATA STRUCTURES. Lab II Metotlar, Diziler ve Hata Ayıklama. Doç. Dr. Aybars UĞUR

Java da İstemci Tarafı Uygulamalar

DATA STRUCTURES. Lab II Metotlar, Diziler ve Hata Ayıklama. Prof. Dr. Aybars UĞUR

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Üst Düzey Programlama

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

Java ile Tasarım Prensipleri ve Tasarım Örüntüleri

Bağlama (Binding) Kavramı

Bölüm 10 Statik ve Anlık Öğeler

BMH-303 Nesneye Yönelik Programlama

BMM3101 PROGRAMLAMA DİLLERİ

J A V A D A P R O G R A M D E N E T İ M İ V E O P E R A T Ö R L E R

Transkript:

Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism) Akın Kaldıroğlu Kasım 2015

Küçük Ama Önemli Bir Konu Ø Bu dosya ve beraberindeki tüm, dosya, kod, vb. eğitim malzemelerinin tüm hakları Akın Kaldıroğlu na aittir. Ø Bu eğitim malzemelerini kişisel bilgilenme ve gelişiminiz amacıyla kullanabilirsiniz ve isteyenleri http://adresine yönlendirip, bu malzemelerin en güncel hallerini almalarını sağlayabilirsiniz. Ø Yukarıda bahsedilen amaç dışında, bu eğitim malzemelerinin, ticari olsun/olmasın herhangi bir şekilde, toplu bir eğitim faaliyetinde kullanılması, bu amaca yönelik olsun/olmasın basılması, dağıtılması, gerçek ya da sanal/internet ortamlarında yayınlanması yasaktır. Böyle bir ihtiyaç halinde lütfen benimle, akin@javaturk.orgadresinden iletişime geçin. Ø Bu ve benzeri eğitim malzemelerine katkıda bulunmak ya da düzeltme ve eleştirilerinizi bana iletmek isterseniz çok sevinirim. Ø Bol Java lı günler dilerim. 2

İçerik ØBu bölüm, nesne-merkezli programlamanın en temel kavramların olan çok şekilliliği (polymorphism) ele alacaktır. ØJava nın tipleri arasındaki mümkün dönüşümler (cast) incelenecektir. 3

Upcasting (Yükseltme) 4

Upcasting - I ØBir referansı ya da nesneyi alıp onu üst tipinden bir referansa atamaya upcasting (yükseltme) denir. ØUpcasting, yerine geçebilme özelliğinden dolayı her zaman güvenlidir. Ø Dolayısıyla cast operatörü () kullanmaya gerek yoktur. Manager m = new Manager(); Employee e = m; ya da doğrudan Employee e = new Manager(); Manager m = new Director(); Emlpoyee e = new Director(); Referans Upcasting Nesne 5

Upcasting - II ØHatırlayın, kalıtım bir genelleştirme-özelleştirme ilişkisi kurgular. ØHiyerarşide aşağıda yer alan yani daha özel tiplerden olan nesneler, yerine geçebilme (substitutability) özelliğinden dolayı, yukarıda yer alan yani daha genel olan tiplerin referanslarına atanabilir. ØBu durumda her özel tipin nesnesi, aynı hiyerarşideki daha genel tipten olan referanslara atanabilir. Employee e = new Employee(); e = new Manager(); e = new Director(); Manager m = new Director(); 6

Neden Upcasting? ØDil, tabiatı itibariyle genel ifadeler ile daha çok şey anlatma eğilimindedir. ØUpcasting de program içerisinde daha genel referanslarla, her türlü alt tipten olan nesneyi gösterme yeteneği sağlar. Ø Employeee ifadesi herhangi bir çalışan anlamına gelir. Ø Manager m ifadesi de herhangi bir yönetici anlamına gelir. ØBu ise programlarımızı basitleştirir. Employee e = new Employee(); Manager m = new Manager(); Director d = new Director(); e = m; e = d; m = d; 7

Metot Parametrelerinde Upcasting ØUpcasting, sıklıkla metot parametrelerinde de görülür. ØBu durum, bir metoda, daha genel tipten parametre almasına rağmen, o tipin tüm alt tiplerinden parametre geçilerek çağrılmasıylaa oluşur. ØpaySalary() metodunun, parametre olarak Employee alması demek, kendisine her tür Employee nesnesinin geçilebilmesi demektir. public class PayrollOffice { public void paysalary(employee e){ double salary = e.calculatesalary(); System.out.println("Paying a salary of " + salary + " to " + e.getname()); } } 8

TestPayrollOffice.java 9

Çok Şekillilik (Polymorphism) 10

Polymorphism - I ØEski Yunanca da poly çok, morph ise şekil demektir. ØPolymorphism de çok şekillilik demektir. ØÇok şekilli olan ise referanslardır. ØPolymorphism, bir referansın, zamanın farklı anlarında, kendi ya da alt tiplerinden olan farklı nesneleri gösterebilmesine denir. Ø Örnekteki e ve m referansları polymorphictir. Employee e = new Employee(); Manager m = new Manager(); Director d = new Director(); e = m; e = d; m = d; 11

Polymorphism - II ØPolymorphism bir yaklaşımdır, upcasting ise onu gerçekleştiren mekanizmadır. ØPolymorphism sayesinde arayüz ile gerçekleştirmeyi ayırabiliriz. ØReferans, üst tipten olduğu için arayüzü, ona atanan nesneler ise, alt tiplerden olabildiğinden, gerçekleştirmeyi ifade ederler. ØDolayısıyla, aynı arayüze sahip nesneler arasında, nesnenin gerçek tipini bilmeden, değişmeler yapabilirsiniz. ØUnutmayın, bir kalıtım hiyerarşisindeki nesneler, en azından en yukarıdaki nesnenin arayüzüne sahiptirler. 12

Polymorphism - III ØBu yüzden polymorphism daha güzel bir tanımla, iki referansın birbirleriyle haberleşip, birbirlerinin gerçek tiplerini bilmemeleri demektir. ØPayrollOffice nesnesi sadece Employee nesnesini bilmekte, alt tiplerini (Manager ve Director) ise bilmemektedir. 13

Interface Implementation Ayırımı - I ØPolymorphism sayesinde arayüz ile gerçekleştirmeyi ayırabiliriz. ØÜst tipten olan referans, tipinin arayüzünü, ona atanan nesneler ise gerçekleştirmeyi ifade ederler. ØBu şekilde gerçekte hangi nesnenin kullanıldığını bilmeden, sadece üst tipe yani arayüze bağlı sınıflar yazılabilir. Program to an interface not an implementation. ØYani, elinizde bir kalıtım hiyerarşisi varsa, kodunuzu o hiyerarşinin arayüzünü belirleyen en üst tipine göre yazın, alttaki sınıfları, gerçekleştirmeleri, göz önüne almayın. ØBu şekilde hiyerarşideki ekleme ve çıkarmalardan etkilenmezsiniz. 14

Interface Implementation Ayırımı - II ØPayrollOffice, Employee hiyerarşisindeki değişimlerden etkilenmez, ØÇünkü PayrollOffice, sadece Employee nin arayüzünü bilmektedir. 15

Polymorphic Metotlar 16

Polymorphic Metotlar - I ØPolymorphism, metotlar için de farklı bir anlama sahiptir. ØBir metodun polymorphic yani çok şekilli olması, arayüzünün sabit olmasına rağmen, overriding sayesinde, pek çok gerçekleştirmeye sahip olması anlamına gelir. ØDolayısıyla farklı gerçekleştirmeler, aynı arayüzün arkasında saklanabilir, birbirleri yerine geçecek şekilde kullanılabilir. 17

Polymorphic Metotlar - II ØBu hiyerarşideki work() metodunu ele alalım. ØBu metodun bir arayüzü olmasına karşın 5 tane gerçekleştirmesi vardır. ØPeki bir polymorphic metodun arayüzü ile gerçekleştirmeleri arasındaki ilişki nasıldır? 18

Polymorphic Metotlar - III ØBu hiyerarşideki work() metodu farklı referanslar üzerinde çağrılırsa, hangi gerçekleştirmeler çalışır? ØBir metodun arayüzü, o metodun kendisi üzerinde çağrıldığı referansın tipi tarafından belirlenir. ØO metodun hangi gerçekleştirmesinin çalışacağı ise referansın gösterdiği nesne tarafından belirlenir. Employee e = new Employee(); e.work(); Manager m = new Manager(); m.work(); Director d = new Director(); d.work(); Employee e = new Employee(); e.work(); e = new Manager(); e.work(); e = new Director(); e.work(); 19

Arayüz - Gerçekleştirme ØEmployee tipinde e referansı üzerinde çağrılabilecek olan metotları belirleyen e nin tipi olan Employee sınıfının arayüzüdür. ØAma çalışma zamanında (run-time) hangi work() metodunun çağrılacağını belirleyen ise e nin gösterdiği nesnenin tipidir. Employee e = new Employee(); e.work(); e = new Manager(); e.work() e = new Director(); e.work(); => Employee s work() => Manager s work() => Director s work() 20

TestPolymorphism.java 21

Başka Bir Açıdan Polymorphism - I ØDaha önce bir metodun arayüzü, o metodun kendisi üzerinde çağrıldığı referansın tipi tarafından belirlenir. O metodun hangi gerçekleştirmesinin çağrılacağı ise referansın gösterdiği nesne tarafından belirlenir. dedik. ØBu durumu şöyle de ifade edebiliriz: Ø Bir metodun bir referans üzerinde çağrılıp çağrılamayacağı, derleme zamanında (compile-time) belirlenir. Çünkü bu karar, referansın tipine bakılarak alınır. Ø Referansın tipinde o metot varsa çağrılabilir yoksa çağrılamaz. Ø Ama gerçekte hangi metodun çağrılacağı, referansın gösterdiği nesneye bağlı olduğundan ve bu da ancak çalışma zamanında belli olacağından, derleme zamanında bilinemez. 22

Başka Bir Açıdan Polymorphism - II ØAşağıdaki kodda hangi work() çağrılır? public class HR{ public Employee getanemployee(){...} } HR hr = new HR(); Employee e = hr.getanemployee(); e.work(); => Hangi work() çağrılır? 23

Başka Bir Açıdan Polymorphism - III ØBu sorunun cevabı bilinemez dir. ØKoda bakarak, derleme zamanında Employee tipinden bir nesne döndürdüğünü gördüğümüz bir metodun, gerçekte Employee nin hangi alt tipini döndürdüğünü koda bakarak bilmemiz mümkün değildir. ØBu bilgi ancak çalışma zamanında, dönen nesnenin gerçek tipi bilinince ortaya çıkar. 24

TestHR.java 25

Employee e = new Manager(); e.work(); Aslında çağrılan Manager in work() metodudur!!! Employee nin work() metodunun çağrılacağını düşnebilirsiniz! 26

Binding 27

Bağlama (Binding) ØProgramlama dillerinde bağlama (binding), değişken, metot, vb. özelliklerin dilin elemanlarıyla ilişkilendirmesidir. Ø Örneğin Java da * sembolünün matematiksel çarpma işlemine bağlanması dilin tasarım zamanında yapılmıştır. ØDillerde temelde iki bağlama zamanı önemlidir: Ø Statik bağlama (static binding): Statik bağlamada özelliklerin, dilin elemanlarıyla ilişkilendirmesi çalışma zamanından önce yapılır ve programın çalışması sırasında da değişmez. Ø Dinamic bağlama (dynamic binding): Dinamik bağlamada ise özelliklerin, dilin elemanlarıyla ilişkilendirmesi çalışma zamanında yapılır ve programın çalışması sırasında değişebilir. 28

Method Binding ØProgramlama dillerinde, operationların, metotlara bağlanmalarına da method binding (metot bağlama) denir. ØNesne merkezli dillerde de metotların bağlanmasında da statik ve dinamik olmak üzere iki farklı bağlama söz konusudur ØMetot polymorphismi, dynamic binding (dinamik bağlama) denen bir teknikle başarılır. 29

Operation ve Method Ayırımı - I ØÖnce operation (message) ve method arasındaki ayırımı açıklayalım. ØBu ayırım nesne-merkezli dillerde söz konusudur. Ø Operation (ya da message) ile soyut olarak yani arayüz seviyesinde bir referansın üzerinde çağrılabilecek olan davranışlar kastedilir. Ø Method ise bir nesnenin üzerinde çağrılan davranışın kendisidir. ØOperation arayüz, metot ise gerçekleştirme demektir. 30

Operation ve Method Ayırımı - II Ø Operation (ya da message) daha çok bir kalıtım hiyerarşisinde birden fazla gerçekleştirmesi olan ve hiyerarşinin en tepesinde tanımlanan metodun arayüzünü, metot ise o hiyerarşideki gerçekleştirmeleri temsil eder. Ø Bir hiyerarşide bir operation ama o operationun birden fazla gerçekleştirmesi yani metodu bulunur. Ø Operation daha çok tasarım ve derleme zamanı, method ise derleme ve çalışma zamanı yapısıdır. 31

Dinamik Bağlama - I ØDinamik bağlamada her şey çalışma zamanı tarafından belirlenir. ØDinamik bağlamada, derleyici sadece çağrılan metodun arayüzü yani operation seviyesinde kontroller yapabilir. Ø Metodun arayüzü, üzerinde çağrı yapılan referansın tipinde var mı? Ø Metodun arayüzü ile çağrısı arasında bir uyumsuzluk var mı? Ø Örneğin, isim, parametre sayı ve tip kontrolleri, dönüş tipi kontrolü vs. 32

Dinamik Bağlama - II ØAma derleyici operationun gerçekte hangi nesne üzerindeki gerçekleştirmesinin çağrılacağını bilemez. Ø Çünkü nesne bir çalışma-zamanı yapısıdır. ØBu bilgi, çalışma zamanında üzerinde metot çağrısı yapılan referansın gösterdiği nesnenin gerçek tipi ortaya çıkana kadar bilinemez. ØNe zaman nesne belli olur, o zaman o nesnenin üzerindeki metodun çağrılacağı belli olur. ØBu yüzden bu tür bağlamaya late binding (geç bağlama) denir. 33

Uygulama - I ØShape sınıfının en tepede olduğu bir hiyerarşi düşünün. Ø Shape in üzerinde draw(), erase(), calculatearea() ve calculatecircumference() metotları vardır. ØCircle, Rectangle, Square ve Triangle ise Shape in alt sınıflarıdır ve bu metotları override ederler. Ø Metotları override ederken mümkünse super i kullanın. ØCanvas diye bir başka sınıf oluşturun ve üzerine Shape alan, drawshape(shape s) ve eraseshape(shape s) metotlarını koyun. 34

Uygulama - II ØShapeFactory isimli bir başka sınıfın üzerindeki createshape() isimli metodun da random olarak bir Shape nesnesi yaratıp döndürmesini sağlayın. ØTest sınıfında da random Shape nesneleri üretip, Canvas ın metotlarına geçin ve hangi metotların çağrıldığını gözleyin. 35

Statik Bağlama ØStatik bağlamada her şey çalışma zamanından önce belirlenir ve programın çalışması sırasında da değişmez. Ø Muhtemelen derleyici tarafından belirlenir. ØStatik bağlanan metotlar ise, bellekteki kodlarına derleyici tarafından derleme zamanında bağlanır. ØBu yüzden bu tür bağlanmaya early binding (erken bağlama) da denir. ØGenel olarak prosedürel dillerdeki metotların bağlanmaları statiktir. 36

Java da Metotları Statik Bağlama - I ØJava da static, private veya final olan metotlar statik olarak bağlanırlar. Ø static metotlar, nesne üzerinde çağrılmazlar, sınıf üzerinde çağrılırlar. Ø Bu yüzden override edilemezler, polymorphic değildirler ve bağlanmaları da statiktir. Ø private metotlar zaten devralınmadığından override da edilemezler ve bağlanmaları statiktir. Ø final metotlar devralınırlar ama override edilemezler ve bağlanmaları statiktir. ØJava da sadece override edilen operationların birden fazla metodu olacağından, dinamik bağlanmaları söz konusudur. 37

Test.java ØTest.java in binding package. 38

Java da Metotları Statik Bağlama - II ØJava da static, private veya final olan metotlar statik olarak bağlanırlar. ØStatik bağlanan metotlar, dinamik bağlanan metotlara göre daha hızlı çalışma eğilimindedirler. Ø Çünkü statik bağlama çalışma zamanında yapılacak işleri derleme zamanına çeker. ØBundan dolayı, override edilmeyen metotları final olarak işaretleyerek çalışma zamanı performansını arttıran araçlar vardır. 39

BindingTest.java ØKullandığınız IDE nin yardımıyla, BindingTest.java nın main metodunda yapılan e.work() ve boss.youworktoo() metodlarının implementation larını bulun. Ø Eclipse te fare ile metodun üstüne gelip CTRL (Win) ya da CMD (Mac) tuşlarına basıp Open Implementation u seçin. ØHangi metodun statik dinamik bağlandığını belirleyin. public class BindingTest { public static void main(string[] args) { HR hr = new HR(); Employee e = hr.getanemployee(); e.work(); } } Boss boss = new Boss(); boss.youworktoo(); 40

Java da Metotları Statik Bağlama - III ØJava da static olan metotlar statik olarak bağlanırlar. ØEğer, ebeveynde olan statik bir metodu alt sınıfta tekrar tanımlarsanız bu overriding olmaz. Ø Buna gölgeleme (shadowing) denir. Ø Yani, alt sınıftaki metot, ebeveynden devralınan metodu gölgeler. 41

Değişken Bağlama ØJava da nesne ve sınıf değişkenleri de nesnelere statik olarak bağlanırlar. ØOverriding, sadece nesne metotları için geçerlidir, değişkenler için söz konusu değildir. ØEğer, ebeveynde olan bir değişkeni (nesne ya da statik olsun) alt sınıfta tekrar tanımlarsanız bu overriding olmaz, gölgeleme (shadowing) olur. 42

Sonuçlar 43

Neden Polymorphism? ØPolymorphism, programların parçaları arasındaki bağımlılıkları arayüz seviyesine çekerek daha kolay değiştirebilme imkanı sağlar. ØPolymorphism sayesinde arayüz ile gerçekleştirmeyi ayırabiliriz. Program to an interface not an implementation. ØVar olan hiyerarşiye yapılacak değişiklikler, o hiyerarşiyi en tepedeki sınıf (yani arayüz) düzeyinde bilen istemci sınıfları etkilemez. ØBu polymorphismin en temel artısıdır. 44

Polymorphismin Bir Sonucu - I ØPolymorphismin negatif tarafı ise, bahsedilen en temel artısının bir sonucudur. ØPolymorphismde alt sınıfların kendilerine has özelliklerini kullanamayız. ØÇünkü polymorphism, bir hiyerarşideki nesneleri, hiyerarşinin en tepesindeki nesne cinsinden ifade ettiğinden, alt sınıfların nesneleri de tepe sınıfın nesnesi olarak görülür. ØBu kalıtımın sağladığı genelleştirme- özelleştirme ilişkisi üzerine bina edilen polymorphic davranışın bir sonucudur. 45

Polymorphismin Bir Sonucu - II ØBir metodun arayüzü, o metodun kendisi üzerinde çağrıldığı referansın tipi tarafından belirlenir. Ø Bundan dolayı Employeetipindeki referansın üzerinde sadece Employee nin arayüzündeki metotlar çağrılabilir. ØO metodun hangi gerçekleştirmesinin alınacağı ise referansın gösterdiği nesne tarafından belirlenir. Employee e = new Employee(); e.work(); e = new Manager(); e.work(); e.manage(); => Derleme hatası e = new Director(); e.work(); e.makeastrategicplan() => Derleme hatası 46

Downcasting (Alçaltma) 47

Upcasting (Tekrar) ØBir referansı ya da nesneyi alıp onu üst tipinden bir referansa atamaya upcasting (yükseltme) denir. ØUpcasting, yerine geçebilme özelliğinden dolayı her zaman güvenlidir. Ø Dolayısıyla cast operatörü () kullanmaya gerek yoktur. Manager m = new Manager(); Employee e = m; ya da doğrudan Employee e = new Manager(); Manager m = new Director(); Emlpoyee e = new Director(); Referans Upcasting Nesne/Referans 48

Downcasting - I ØPeki, üst bir tipten olan bir referansı ya da nesneyi, alt tiplerinden olan bir referansa atayabilir miyiz? Ø Ve bu ne işe yarar? ØÜst tipten olan bir referansı ya da nesneyi alıp onu alt tipinden bir referansa atamaya downcasting (alçaltma) denir. 49

Downcasting - II ØJava, üst tipten olan bir referansı ya da nesneyi alıp onu alt tipinden bir referansa atamaya izin vermez, derleme hatası verir. Ø Bu türden atamaya yani downcastinge ancak cast operatörü () ile izin verir. Ø Cast operatörü içinde hedef tip bulunur. Employee e = new Employee(); Manager m = e; // Derleyici hatası Manager m = (Manager) e; // Problem! m.manage(); Director d = (Director)new Manager(); Director d = (Director)new Employee(); Nesne ya da Referans Downcasting Referans 50

Downcasting - III ØCast operatörü kullanarak çevrime zorlamak, derleyici hatasını giderir ama çalışma zamanında hala gerçek nesnenin çevrilen tipe uygun olmamama riski vardır. ØEğer cast edilen nesne ya da referansın gösterdiği nesne, hedef tipten ya da onun alt tipinden değilse, bu durumda çalışma zamanında java.lang.classcastexception sıra dışı durumu oluşur. Employee e = new Manager(); Manager m = (Manager) e; // Gerçek tipe geri dönüş Employee e = new Employee(); Manager m = (Manager) e; // ClassCastException! Director d = (Director) new Manager(); // ClassCastException! Director d = (Director) new Employee();// ClassCastException! 51

DowncastingExample.java 52

Downcasting - IV ØDowncast işlemine çoğunlukla, üst tipten bir referans döndüren metot çağrılarından sonra ihtiyaç duyulur. ØCast operatörü kullanarak çevrim yaparken, çevrimin uygun bir tipe yapılmaması ihtimalinden dolayı ClassCastException sıra dışı durumu fırlatılabilir. HR hr = new HR(); Employee e = hr.getanemployee(); // Exact type of the returned object is not known! Director d = (Director) e; // Risk of ClassCastException! d.makeastrategicplan(); 53

ClassCastException ØClassCastException, java.lang paketindeki sıra dışı durum sınıflarından birisidir. ØBir nesne, nesnesi olmadığı, kendi tipinin alt tiplerinden birine çevrilmeye çalışıldığında fırlatılır. 54

instanceof Operatörü ØCast operatörü kullanarak çevrim yaparken, çevrimin uygun bir tipe yapılmamasından doğacak ClassCastException sıra dışı durumunu önlemenin yöntemi, instanceof operatörüdür. Øinstanceof operatörü sağa ve sola birer tane olmak üzere iki tane operand alır ve boolean döndürür: Ø Soldaki test edilecek referans, sağdaki ise hedef tiptir. Employee e = new Employee(); if(e instanceof Manager){ Manager m = (Manager) e; } Director d = (Director)new Manager(); Director d = (Director)new Employee(); 55

InstanceofExample.java 56

Upcasting vs. Downcasting - I ØUpcasting, tüm nesneleri, ebeveynleri tipinden görmemizi ve onlara sanki ebeveynmiş gibi davranmamızı sağlar. ØUpcastingin negatif tarafı ise, üst tiplerden referanslarla gösterilen nesnelerin, ebeveynlerinde olmayan, kendilerine has olan özelliklerini kaybetmeleridir. ØÇünkü bir nesnenin üzerinde erişilebilecek olan özellikleri, o nesnenin referansının tipi belirler. Ø Referans üst tipten olduğu için referansın arayüzü, gerçek nesnenin arayüzünden daha dardır (extends anahtar kelimesi!) 57

Upcasting vs. Downcasting - II ØDolayısıyla upcasting, nesneleri tek tipleştirir, farklılıklarını ortadan kaldırır. Ø Farklı özelliklere sahip olan nesneler, aynı referansa atandığında, arayüzleri aynileşir ve referansın arayüzüne iner. ØDowncasting ise bu şekilde kendine has olan özelliklerini, üst tipten referansa atanmasından dolayı kaybetmiş olan nesnelere, var olan özelliklerini geri kazandırır. ØUpcasting ile tek tipleşmiş olan nesneler, downcasting ile tabiri caizse kendilerine gelirler, tüm özelliklerini gösterebilirler. 58

TestPayrollOffice.java ØTestPayrollOffice.java yı çalıştırmadan önce PayrollOfice.java daki paysalary(employee e) metodunu değiştirin. 59

Özet ØBu bölümde, çok şekillilik (polymorphism) ele alındır. Ø Referanslar ve metotların polymorphicdavranışları incelendi. ØTipler arasındaki upcasting ve downcasting çevrimleri (conversion) ele alındı. Øinstanceof operatörü ile RunTime Type Identification (RTTI) işlendi. 60

Ödevler 61

Ödevler I Ø Daha önce oluşturduğunuz Shape hiyerarşisini ele alın. Ø Canvas sınıfının üzerinde var olan drawshape() ve eraseshape() metotlarında çizilen ya da silinen nesnenin gerçek tipine göre yarı çapını, kenarlarını ve yüksekliğini konsola yazın. 62

Ödevler II Ø Yandaki yapıyı oluşturun. Ø Upcasting ve downcasting ile instanceof kullanacak şekilde RegistrationOffice metotlarını kurgulayın. 63