Java Dersleri 7 – Çok Biçimlilik (Polymorphism)

Bu dersimizde Java’nın nesne odaklı programlamanın olmazsa olmazlarından çok biçimliliği nasıl gerçeklediğini öğreneceğiz. Çok biçimlilik aynı tip değişken üzerinden birbirinden farklı davranışlar elde etme tekniğidir. Programlama dillerinin dinamik bağlama (dynamic binding) yada koşum zamanı bağlama (runtime binding) özelliğinden faydalanılarak hayata geçirilir. Tabiki dinamik bağlamadan yararlanabilme için metod ezme (method overriding) tekniğini bilmemiz gerekiyor. Öncelikle bahsettiğimiz terimleri örneklerle açıklayalım. Metod ezme işlemi kalıtım esnasında ana sınıfta halihazırda tanımlı olan methodu yeniden yazarak ana sınıftaki metodu geçersiz kılma işlemidir. Örneğin :


public class KMeansCluster {

    public String toString()
    {
        return "KMeansCluster";
    }
}

yukarıdaki kod parçasında KMeansCluster sınıfı varsayılan ana sınıfı olan Object (Java’da her sınıf Object sınıfından türer)
sınıfının toString metodunu ezmiştir. Bu metod KMeansCluster cinsinden herhangi bir nesnenin print() metodlarından herhangi birine verildiği zaman çalışır yani :

KMeansCluster kmc = new KMeansCluster();
System.out.print(kmc);

satırları ekrana KMeansCluster yazacaktır. Burada dikkat etmemiz gereken iki temel nokta var :

  1. Ezdiğimiz metodların imzaları aynı olmalıdır. Metod imzası ise metod adı, metod parametre sayısı ve metod parametre tiplerinden oluşur.
  2. static tanımlanan metodlar ezilemezler

Dİnamik bağlama referans tiplerinin derleme zamanında değil de çalışma zamanında atanması esasında dayanır. Bir örnekle açıklarsak :


public class ClusteringBase
{
    public void cluster()
   {
           System.out.println("Cluster Base");
   }
}

public class KMeansClustering extends ClusteringBase
{
    public void cluster()
   {
           System.out.println("KMeansClustering");
   }
}

public class HierarchicalClustering extends ClusteringBase
{
    public void cluster()
   {
           System.out.println("HierarchicalClustering");
   }
}

Yukarıda bir tane ana sınıf (ClusteringBase) iki tane de bu ana sınıftan türeyen alt sınıf tanımladık(KMeansClustering,HierarchicalClustering). Alt sınıflarda cluster(kümeleme) metodunu ezdik. Şimdi bu sınıfları kullanarak çok biçimlilik esasına göz atalım :

ClusteringBase cluster1 = new ClusteringBase();
ClusteringBase cluster2 = new KMeansClustering();
ClusteringBase cluster3 = new HierarchicalClustering();

cluster1.cluster();
cluster2.cluster();
cluster3.cluster();

Buradaki

ClusteringBase cluster2 = new KMeansClustering();
ClusteringBase cluster3 = new HierarchicalClustering();

ifadeleri kalıtım kuralları çerçevesinde doğrudur. Yani bir üst sınıf referansına alt sınıf referansı atanabilir(Tersi yanlıştır).
Dikkat etmemiz gereken kısım üst sınıf referansıyla yapılam cluster() metod çağrımlarıdır. Burada referans tipi her ne kadar
üst sınıf olan ClusteringBase tipinde olsa da çağrılan metodlar çalışma zamanında (runtime) belirlenerek ilgili alt sınıfların metodlarının çağırımı sağlanır. Yukarıdaki kod parçası :

ClusterBase
KMeansClustering
HierarchicalClustering

çıktısını verir. Çok biçimliliğin yazılımcıya sağladığı en büyük avantaj farklı türden nesneleri ana sınıflarını baz alarak aynı ortamda yönetebilme ve gerektiğinde özel fonksiyonaliteyi tekrar kazanabilme avantajıdır.

İlgili Yazılar:

  1. Java Dersleri 5 – Kalıtım (Inheritance) Bu derste Java’nın nesne yönelimli programlamanın temeli olan kalıtım(Inheritance) kavramını...
  2. Java Dersleri 6 – Arayüzler ve Gerçeklenmesi (Interface and Implementation) Nesne odaklı programlamada arayüzler sınıfların dış dünyaya açılan kapılarıdır. Bir...
  3. Java Dersleri 4 – Erişim Denetleyicileri (Access Modifiers) Bu dersimizde Java’nın metodlar ve sınıflar üzerinde erişim kurallarını düzenleyen...
  4. Java Dersleri 8 – İç, Gömülü ve İsimsiz Sınıflar (Inner, Nested and Anonymous Classes) Bu dersimizde Java’nın gömülü sınıf yapısını öğreneceğiz. Java programlama dili...
  5. Java Dersleri 16 – Enum Yapısı Java da enum yapıları 1.5 versiyonuyla birlikte gelmiştir. Bu versiyondan...

Fikrin geldiyse buraya yaz


[ Ctrl + Enter ]