Java Polymorfizm (Çok Biçimlilik) Nedir? IS-A Testi, Örnekler ve Avantajlar

Bu yazıda Java polymorfizm konusunu; IS-A testi, referans değişkenleri, interface ve kalıtım üzerinden güncel ve anlaşılır örneklerle ele alacağız.

Polymorfizm (Çok Biçimlilik) nedir?

Polymorfizm (çok biçimlilik), bir nesnenin farklı türlerdeki referanslar üzerinden kullanılabilmesidir. Java’da bu, genellikle bir nesnenin kendi sınıfı dışında üst sınıfı (superclass) veya uyguladığı interface türünden bir referansla tutulması anlamına gelir.

Özet: Nesne aynı nesnedir, fakat onu işaret eden referans tipi değişebilir. Bu sayede daha esnek, daha genişletilebilir ve daha okunabilir bir yapı kurarsınız.

IS-A testi ile polymorfik olma

“IS-A testi” pratikte şunu sorar: Bu nesne, şu türden biri midir? Örneğin Kedi bir Hayvan ise, “Kedi IS-A Hayvan” doğrudur. Aynı şekilde Kedi bir Hareket interface’ini uyguluyorsa “Kedi IS-A Hareket” de doğrudur.

Not: Java’da (Object hariç) çoğu nesne, en azından kendi türü ve Object üzerinden IS-A testini geçer. Bu yüzden polimorfik kullanım OOP’nin temel taşlarından biridir.

Polymorfizmin avantajları

  • Esneklik: Sınıflar arası bağımlılığı azaltır, sistemi daha güvenli ve yönetilebilir hale getirir.
  • Daha az tekrar: Ortak davranışları tek noktada yöneterek tekrar eden kodu azaltır.
  • Bakım kolaylığı: Değişiklikleri daha küçük bir alanda yaparak hata çözmeyi kolaylaştırır.
  • Genişletilebilirlik: Yeni sınıflar eklerken mevcut kodu kırmadan ilerlemenizi sağlar.

Günlük hayattan mini örnek: Tüm öğrenciler “mezun olma” koşuluna sahiptir; fakat ilkokul mezuniyet koşulları ile ortaokul mezuniyet koşulları farklı olabilir. Davranış aynı isimle ifade edilir, uygulama (detay) değişebilir.

Referans değişkeni nedir?

Bir nesneye erişmenin temel yolu referans değişkenidir. Aşağıdaki örnekte referans değişkeni d’dir:

Deneme d = new Deneme();

new Deneme() ile heap üzerinde nesne oluşturulur; d ise bu nesnenin adresini (referansını) tutar. Referans değişkenleri için önemli noktalar:

  • Referansın türü bir kez tanımlanır; sonradan değişmez (ama işaret ettiği nesne değişebilir).
  • Referans başka bir nesneye atanabilir (referans final değilse).
  • Referansın türü, hangi metotların çağrılabileceğini belirler.
  • Referans; kendi türündeki nesneyi veya alt türünü işaret edebilir.
  • Referans türü bir interface ise, o interface’i uygulayan sınıfların nesnelerini tutabilir.

Java’da neden birden fazla sınıf extend edilemez?

Java’da bir sınıf birden fazla sınıfı aynı anda extends edemez:

// Bu Java'da mümkün değil:
class Oyun extends SekilliOyun, HareketliOyun { }

Çünkü Java çoklu kalıtımı sınıflar üzerinden desteklemez. Ancak birden fazla interface uygulanabilir. Bu da polymorfizmin en pratik kapılarından biridir.

Interface + kalıtım ile polymorfizm örneği

Önce interface ve üst sınıfımızı tanımlayalım:

public interface Hareket {
    void kosma();
}

class Hayvan {
    public void hayvanSesi() {
        System.out.println("Hayvanlar ses çıkarır.");
    }
}

Şimdi alt sınıflarımızı oluşturalım (override + interface implement):

class Kedi extends Hayvan implements Hareket {

    @Override
    public void hayvanSesi() {
        System.out.println("Kediler meow der.");
    }

    @Override
    public void kosma() {
        System.out.println("Kediler kısa mesafede hızlı olabilir.");
    }
}

class Kopek extends Hayvan implements Hareket {

    @Override
    public void hayvanSesi() {
        System.out.println("Köpekler havlar.");
    }

    @Override
    public void kosma() {
        System.out.println("Köpekler genellikle daha dayanıklı koşar.");
    }
}

Polymorfik referanslarla kullanım

Hayvan hayvan1 = new Kedi();    // Kedi IS-A Hayvan
Hayvan hayvan2 = new Kopek();   // Köpek IS-A Hayvan

Hareket hareket1 = new Kedi();  // Kedi IS-A Hareket
Hareket hareket2 = new Kopek(); // Köpek IS-A Hareket
Kritik nokta: Referans tipi neyse, IDE size o tipin metotlarını “çağrılabilir” olarak gösterir. Mesela Hareket hareket1 = new Kedi(); satırında hareket1 üzerinden sadece kosma() çağırabilirsiniz (çünkü interface bunu garanti eder).

Çalışma zamanında (runtime) dinamik metot çağrısı

Polymorfizmde asıl “sihir”, override edilmiş instance metotların çalışma zamanında gerçek nesnenin türüne göre çağrılmasıdır. Yani referans Hayvan olsa bile, nesne Kedi ise Kedi’nin metodu çalışır.

Hayvan h = new Kedi();
h.hayvanSesi();  // Çıktı: Kediler meow der.

Önemli: Bu dinamik bağlama statik metotlar ve alanlar (variables/fields) için geçerli değildir; temel olarak override edilen instance metotlar için geçerlidir.

Sık sorulan sorular

Polymorfizm ile kalıtım aynı şey mi?

Hayır. Kalıtım (inheritance) bir araçtır; polymorfizm ise bu araçla (ve özellikle interface ile) “tek bir referans türü üzerinden farklı davranışlar” sergileyebilme fikridir.

Java’da çoklu kalıtım yoksa polymorfizm nasıl oluyor?

Java’da sınıflar için çoklu kalıtım yok ama çoklu interface implement vardır. Bu, polymorfik tasarımların en sık kullanılan yöntemlerinden biridir.

Interface referansı ile nesneyi tutmanın faydası ne?

Kodu “somut sınıfa” değil, “sözleşmeye” (interface’e) bağlamış olursunuz. Böylece sınıf değişse bile (ör. Kedi yerine başka bir sınıf), sistemi daha az kırarsınız.

Devamı: Kodlar ve benzeri Java içerikleri için latestsoftwaredevelopers.com adresini ziyaret edebilirsiniz.

© Latest Software Developers — Java & OOP içerikleri

Beğendiysen bir çay ısmarlayabilirsin ☕

Bana çay ısmarla

Java ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *