"Enter"a basıp içeriğe geçin

JAVA – Polymorphism (Çok Biçimlilik)

Polymorphism (çok biçimlilik) kelimesi Yunanca Poly (çok) ve Morph(biçim) kelimelerin birleşmesinden oluşmaktadır.

Polymorphism; programlamada ise aynı isimdeki metodların farklı işlevşeri yerine getirmesi, yani farklı biçimlerde çalışması anlamına gelmektedir.

Konuyu örneklerle anlatmak, sözel ifadelerin daha anlaşılır bir şekle dönüşümü ve hayalinizde canlanmasını sağlayabilir.

Not: Bu konu, Inheritance (Kalıtım) ve Overloading(Aşırı Yükleme) konuları ile ilişkili olduğu için, yeri geldiğinde bu konulara atıfta bulunulacaktır. Eğer belirttiğim konularda bilgi sahibi değilseniz lütfen önce bu makaleleri okuyunuz.

Javada 2 tip polymorphism vardır.

  1. Static Polymorphism (Statik Çok Biçimlilik)
  2. Dynamic Polymorphism (Dinamik Çok Biçimlilik)

Static Polymorphism (Statik Çok Biçimlilik)

Derleme zamanında (Compile Time) Polymorphism özelliği gösteren bütün varlıklara static polymorphism denir. Operator Overloading (Operatör Aşırı Yükleme), Constructor Overloading (Yapıcı Metot Aşırı Yükleme), ve Method Overloading (Metot Aşırı Yükleme) buna en iyi örnekler olarak söylenebilir. Çünkü bunlar compile time’da çok biçimlilik özelliği gösterirler. Static Polymorphism’de hangi nesnenin ne iş yapacağına derleme esnasında belirlenir.

Şimdi static polymorphism konusunu biraz daha yakından inceleyelim.

  1. Operator Overloading (Operatör Aşırı Yükleme): Artı (+) operatörü 1 sayıyı toplamak amacı ile kullanılabileceği gibi iki stringi birleştirmede de kullanılabilmektedir. Ör1: 3+7 Ör2: “Önder”+”DAL”. (+) operatörü javada aşırı yüklenmiş olan tek operatördür.
  2. Constructor Overloading (Yapıcı metot Aşırı Yükleme): Bir class (sınıf) içinde birden fazla costructor kullanılabilir. Buna constructor overloading denir. Bu durum da static polymorphism’e bir örnektir.
  3. Method Overloading (Metotların Aşırı Yüklenmesi)Aynı clas’da aynı metotlara farklı biçimlerde işlemler yaptırabiliriz. Buna Method Overloading adı verilir. Aynı metot isimlerine overloading ile farklı işlemler yaptırılması, aynı metotların farklı biçimlerde bulunması polymorphism’i gösterir.

Dönüşüm işlemlerinde super class referans değişkenleri, sub class nesnelerini refere eder (gösterir). Bu işlem bize polymorphism’i gösterir. Örneğin:

class A {
    //Diğer İfadeler
}
 
class B extends A {
    //Diğer İfadeler
}
 
class C extends B {
    //Diğer İfadeler
}
 
public class D {
    public static void main(String[] args) {
        A a = new A();  //A-Class değişkeni, A-Class nesnesini refere eder.
        a = new B();    //A-Class değişkeni, B-Class nesnesini refere eder.
        a = new C();    //A-Class değişkeni, C-Class nesnesini refere eder.
    }
}

Yukarıdaki örnekte A class’ı içinde oluşturulan değişkenler B class’ından veya C class’ından erişilebilir. Çünkü Hem B nın hem de C nin super class’ı A class’ıdır.

Dynamic Polymorphism (Dinamik Çok Biçimlilik)

Run time (çalışma zamanı) da polymorphism gösteren bütün nesneler dynamic polymorphism olarak adlandırılırlar. Static polymorphism ile Aradaki farkı kaçırmamak için tekrar edelim; static polymorphism compile time (derleme zamanı) da polymorphism özelliği gösterir. Dynamic’de ise run time (çalışma zamanı) da.

Aşağıdaki örneği inceleyelim.

class SuperClass {
    void superClassMetodu() {
        System.out.println("super class'dan çağrıldı");
    }
}
 
class SubClass extends SuperClass {
    //Super Class Metodu aşırı yüklendi
    void superClassMetodu() {
        System.out.println("sub class'dan çağrıldı");
    }
}
 
public class D {
    static void arac(SuperClass superclass) {
        superclass.superClassMetodu();
        //parametre ile gelen super class dan extend edilmiş diğer sub classlara göre farklı çalışma biçimleri elde edilecektir.
        //Hangi işleyişin çalışacağı ise sadece run time (çalışma zamanı) da belirlenecek.
        //Bu olay da dynamic polymorphism'i gösterir.
    }
 
    public static void main(String[] args) {
        SuperClass superclass1 = new SuperClass();
        SubClass subclass = new SubClass();
        SuperClass superclass2 = new SubClass();
        
        //Aşağıdaki kodlarda görüldüğü gibi aynı metoda farklı nesneleri parametre olarak göndererek ekran çıktısı değişir.
        // Farklı biçimde çalışmış olur.
        
 
        arac(superclass1);  //Ekrana: "super class'dan çağrıldı"
        arac(subclass);     //Ekrana: "sub class'dan çağrıldı"
        arac(superclass2);  //Ekrana: "sub class'dan çağrıldı"
    }
}

Konu umarım anlaşılmıştır. Eğer aklınızda soru işaretleri var ise lütfen benimle yorum kısmından, yorum yaparak iletişime geçiniz.

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir