🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-10: Polymorphism (Çok Biçimlilik) ve Dinamik Bağlama 🎭

🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-10: Polymorphism (Çok Biçimlilik) ve Dinamik Bağlama 🎭

Selamlar! Serimizin 10. bölümüne hoş geldiniz.

Önceki bölümde Inheritance (Kalıtım) yapısını, `extends` ve `super` kelimelerini, ayrıca Method Overriding kavramını incelemiştik. Bu bölümde ise OOP’nin üçüncü ana temeli olan **Polymorphism (Çok Biçimlilik)** ilkesini, **Upcasting / Downcasting** işlemlerini ve **`instanceof`** operatörünü detaylarıyla öğreneceğiz.

---

📌 1. Polymorphism (Çok Biçimlilik) Nedir? 🎭

Polymorphism; bir nesnenin veya metodun **birden farklı biçimde** davranabilme yeteneğidir.

Gerçek hayattan bir örnek vermek gerekirse: Bir şirket çalışanına "İşini Yap" talimatı verdiğinizde;
• Bir *Yazılımcı* kod yazar,
• Bir *Tasarımcı* arayüz çizer,
• Bir *Muhasebeci* fatura keser.

Tek bir komut ("İşini Yap"), nesnenin gerçek tipine göre farklı çıktılar üretir. İşte bu Polymorphism'dir!

---

🏗️ 2. Upcasting (Üst Tipe Dönüştürme) ⬆️

Java'da **üst sınıf referansı (superclass reference)**, alt sınıflardan (subclass) türetilmiş herhangi bir nesneyi tutabilir. Buna **Upcasting** denir ve otomatik olarak gerçekleşir.

Sözdizimi: `UstSinif referans = new AltSinif();`

### Örnek Sınıf Hiyerarşisi (`Hayvan.java`, `Kopek.java`, `Kedi.java`):

class Hayvan {
public void sesCikar() {
System.out.println("Hayvan bir ses çıkarıyor...");
}
}

class Kopek extends Hayvan {
@Override
public void sesCikar() {
System.out.println("Köpek: Hav hav! 🐕");
}

public void topGetir() {
System.out.println("Köpek topu getirdi!");
}
}

class Kedi extends Hayvan {
@Override
public void sesCikar() {
System.out.println("Kedi: Miyav! 🐈");
}
}

### Polymorphism ve Upcasting Kullanımı (`Main.java`):

public class Main {
public static void sesEttir(Hayvan h) {
// Hangi hayvan nesnesi gelirse gelsin, kendi ezilmiş (overridden) metodu çalışır!
h.sesCikar();
}

public static void main(String[] args) {
// Upcasting: Hayvan referansı Kopek ve Kedi nesnesi tutuyor
Hayvan h1 = new Kopek();
Hayvan h2 = new Kedi();

// Dinamik Metot Bağlama (Dynamic Method Binding)
h1.sesCikar(); // Çıktı: Köpek: Hav hav! 🐕
h2.sesCikar(); // Çıktı: Kedi: Miyav! 🐈

System.out.println("-------------------------");

// Metot parametresi olarak Polymorphism kullanımı:
sesEttir(new Kopek());
sesEttir(new Kedi());
}
}

---

🔄 3. Downcasting ve `instanceof` Operatörü ⬇️

Üst sınıf referansı ile tutulan bir nesne üzerinden yalnızca üst sınıfta tanımlı metotlara erişilebilir. Alt sınıfa özel olan metotları (örneğin `Kopek` sınıfındaki `topGetir()`) çağırabilmek için referansı tekrar alt sınıfa dönüştürmemiz gerekir. Buna **Downcasting** denir.

⚠️ **Tehlike:** Yanlış tipe downcasting yapmak runtime'da `ClassCastException` hatası fırlatır! Bu hatayı önlemek için dönüşüm öncesi **`instanceof`** operatörü kullanılır.

### Güvenli Downcasting Örneği:

public class Main {
public static void oyunuBaslat(Hayvan h) {
h.sesCikar();

// Nesnenin gerçekten Kopek olup olmadığını kontrol ediyoruz
if (h instanceof Kopek) {
Kopek k = (Kopek) h; // Güvenli Downcasting
k.topGetir();
} else {
System.out.println("Bu hayvan top getiremez!");
}
}

public static void main(String[] args) {
Hayvan k = new Kopek();
Hayvan c = new Kedi();

oyunuBaslat(k);
System.out.println();
oyunuBaslat(c);
}
}

---

🚀 4. Modern Java Pattern Matching for `instanceof` (Java 16+) 🌟

Java 16 ile birlikte `instanceof` kontrolü ve cast işlemini tek satırda yapmamızı sağlayan harika bir özellik gelmiştir:

public class Main {
public static void hayvanIslem(Hayvan h) {
// Pattern Matching: Doğrudan 'k' adında Kopek değişkenine atanır!
if (h instanceof Kopek k) {
k.topGetir();
}
}
}

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Polymorphism felsefesini, Upcasting ve Downcasting kavramlarını, `instanceof` kontrolünü ve modern Pattern Matching yapısını öğrendik.

👉 **Bölüm 11'de Bizi Ne Bekliyor?**
• OOP'nin Dördüncü Ana Temeli: **Abstraction (Soyutlama)** 🎨
• Soyut Sınıflar (**Abstract Classes**) ve `abstract` Metotlar
• Arayüzler (**Interfaces**) ve `implements` Kull
anımı
• Abstract Class vs Interface Karşılaştırması

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! ☕✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,050Konular
3,297,703Mesajlar
326,233Kullanıcılar
membiSon Üye
Üst Alt