Soru tarihi:
Polymorfizm — nesne yönelimli programlamanın (OOP) en önemli prensiplerinden biridir ve Java'nın kuruluşundan itibaren desteklenmektedir. Polymorfizm, bir nesnenin programın çalışma zamanı sırasında gerçek türüne bağlı olarak farklı davranmasını sağlar; bu, temel tür referansı kullanılsa bile mümkündür.
Sorun:
Polymorfizm olmadan kod esnekliği azalır; farklı türlerdeki nesnelerle çalışmak için sık sık tekrar eden switch-case veya if-else yapıları ortaya çıkar. Bu, kodun bakımını ve genişletilmesini zorlaştırır. Polymorfizm, farklı türler için tekrar eden kod yazma ihtiyacını ortadan kaldırır.
Çözüm:
Java'daki polymorfizm, kalıtım ve arayüzler aracılığıyla gerçekleştirilmiştir. Şunları sağlar:
Kod örneği:
class Animal { void speak() { System.out.println("Hayvan konuşur"); } } class Dog extends Animal { @Override void speak() { System.out.println("Köpek havlar"); } } class Cat extends Animal { @Override void speak() { System.out.println("Kedi miyavlar"); } } public class PolyDemo { public static void main(String[] args) { Animal a1 = new Dog(); Animal a2 = new Cat(); a1.speak(); // Köpek havlar a2.speak(); // Kedi miyavlar } }
Anahtar özellikler:
Overloading ile overriding arasındaki fark nedir?
Overloading — aynı isimde ancak farklı imzalara sahip birden fazla yöntemin aynı sınıfta tanımlanmasıdır. Overriding — bir alt sınıfta, üst sınıfta mevcut olan yöntemle aynı imzaya sahip bir yöntem tanımlamaktır.
class Example { void foo(int x) {} void foo(String y) {} // bu overloading'dir } class Base { void foo() {} } class Child extends Base { @Override void foo() {} // bu overriding'dir }
Kalıtım olmadan polymorfizm olabilir mi?
Klasik anlamda Java'da — hayır: polymorfizm kalıtım hiyerarşisinin veya uygulanabilir bir arayüzün varlığını gerektirir.
Üst sınıf referansından alt sınıf yöntemleri çağrılabilir mi?
Yalnızca üst sınıfta tanımlı veya alt sınıfta override edilmiş yöntemler çağrılabilir. Sadece alt sınıfta bulunan yöntemler, tür dönüştürmesi olmadan çağrılamaz.
Animal a = new Dog(); a.speak(); // bu mümkün // a.fetch(); // derleme hatası, Dog'da fetch() metodu olsa bile
Proje, Dog, Cat, Cow sınıflarını uyguladı, ancak kullanılan kod doğrudan türlerle çalışıyordu, belirgin tür dönüştürmeleri ve instanceof ile yöntemleri çağırıyordu:
Artılar:
Eksiler:
Animal'dan kalıtım alarak sanal speak() oluşturma. Tüm etkileşim temel tür Animal üzerinden sağlanıyor.
Artılar:
Eksiler: