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 :
- Ezdiğimiz metodların imzaları aynı olmalıdır. Metod imzası ise metod adı, metod parametre sayısı ve metod parametre tiplerinden oluşur.
- 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:
- 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ı...
- 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...
- 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...



Java camiası bu aralar bu gelişmeyle çalkalanıyor galiba. 4 Aralık'ta Java'nın gücüyle, Ajax, Silverlight ve Flash entegrasyonu gibi bir şey olarak aklımda imajı oluşan JavaFX'in Software Development Kit'i (SDK Yazılım Geliştirme Paketi) 






























NetBeans kullanmaya bir ay önce falan başladım. Daha önce JCreator gibi daha basit ve esnek bir IDE (Integrated Development Enviroment) kullanıyordum. NetBeans'a geçince kendimi bir tankın içinde gibi hissettim.







