🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-9: Inheritance (Kalıtım / Miras) ve Method Overriding 🧬

🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-9: Inheritance (Kalıtım / Miras) ve Method Overriding 🧬

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

Önceki bölümde OOP’nin ilk temel sütunu olan Encapsulation (Kapsülleme) ilkesini, erişim belirteçlerini ve Getter/Setter mimarisini incelemiştik. Bu bölümde ise OOP’nin ikinci ana direği olan **Inheritance (Kalıtım / Miras Alma)** ilkesini, **`extends`** ve **`super`** anahtar kelimelerini ve **Method Overriding (Metot Ezme)** kavramını öğreneceğiz.

---

📌 1. Inheritance (Kalıtım / Miras) Nedir? 🎭

Kalıtım, var olan bir sınıfın (Superclass / Parent) özelliklerini ve metotlarını yeni oluşturulan bir sınıfa (Subclass / Child) aktarması işlemidir.

Neden Gereklidir?
✨ **Kodun Yeniden Kullanılabilirliği (Reusability):** Ortak kodları tekrar tekrar yazmak yerine üst sınıfta bir kez tanımlarız.
📐 **Hiyerarşik Düzen:** Gerçek dünyadaki nesne ilişkilerini (örneğin *Çalışan* -> *Mühendis*, *Yönetici*) kod ortamına aktarır.
Maintenance kolaylığı sağlar: Ortak bir davranış değiştiğinde sadece üst sınıfı güncellemek yeterlidir.

### Temel Terimler:
• **Superclass (Parent / Üst Sınıf):** Miras veren sınıftır.
• **Subclass (Child / Alt Sınıf):** Miras alan sınıftır. `extends` kelimesi ile üst sınıfa bağlanır.

> **Kritik Kural:** Java **Çoklu Kalıtımı (Multiple Inheritance)** desteklemez! Bir sınıf doğrudan yalnızca **TEK BİR** sınıftan `extends` edebilir.

---

🏗️ 2. `extends` İle Kalıtım Uygulaması ⚙️

Gelin bir şirket sistemindeki ortak çalışanları ve uzmanlıkları modelleyelim.

### Üst Sınıf (`Calisan.java`):

public class Calisan {
private String isim;
private double maas;

public Calisan(String isim, double maas) {
this.isim = isim;
this.maas = maas;
}

public void calis() {
System.out.println(isim + " çalışmaya başladı.");
}

// Getter ve Setter Metotları
public String getIsim() { return isim; }
public void setIsim(String isim) { this.isim = isim; }
public double getMaas() { return maas; }
public void setMaas(double maas) { this.maas = maas; }
}

### Alt Sınıf (`Yazilimci.java`):

// 'extends Calisan' diyerek Calisan sınıfının tüm public/protected alanlarını devralıyoruz
public class Yazilimci extends Calisan {
private String uzmanlikDili;

// Subclass Constructor
public Yazilimci(String isim, double maas, String uzmanlikDili) {
// super() ile üst sınıfın (Calisan) constructor'ı çağrılır
super(isim, maas);
this.uzmanlikDili = uzmanlikDili;
}

// Yazılımcıya özel yeni metot
public void kodYaz() {
System.out.println(getIsim() + ", " + uzmanlikDili + " dili ile kod yazıyor. 💻");
}
}

---

⚡ 3. `super` Anahtar Kelimesi Kullanımı 🔑

`super`, alt sınıf içinden üst sınıftaki üyelere (constructor, metot veya field) erişmek için kullanılan özel bir referanstır.

### Kullanım Biçimleri:
1. **`super(...)`**: Üst sınıfın constructor'ını çağırır. Alt sınıf constructor'ında **İLK SATIRDA** olmak zorundadır.
2. **`super.metotAdi()`**: Üst sınıftaki bir metodu doğrudan çalıştırmak için kullanılır.

---

🔄 4. Method Overriding (Metot Ezme / İptal Etme) 🛠️

Alt sınıf, üst sınıftan miras aldığı bir metot davranışını özelleştirmek veya değiştirmek isterse, o metodu aynı isim ve aynı parametrelerle kendi içinde **yeniden yazar**. Buna **Method Overriding** denir.

• **`@Override` Anotasyonu:** Derleyiciye bu metodun üst sınıftan ezildiğini bildirir. Yazım hatalarını önlemek için kullanılması en iyi pratiktir (Best Practice).

### Alt Sınıf Metot Ezme Örneği (`Yonetici.java`):

public class Yonetici extends Calisan {
private double prim;

public Yonetici(String isim, double maas, double prim) {
super(isim, maas);
this.prim = prim;
}

// Üst sınıftaki 'calis' metodunu kendi ihtiyacımıza göre eziyoruz (Overriding)
@Override
public void calis() {
System.out.println(getIsim() + " yönetici olarak ekibi koordine ediyor. 👔");
}

// Ekstra metot
public void primEkle() {
System.out.println(getIsim() + " yöneticisine " + prim + " TL prim eklendi.");
}
}

---

🧪 5. Kalıtım ve Overriding Kullanımı (`Main.java`) 🚀

public class Main {
public static void main(String[] args) {
// Yazılımcı nesnesi türetme
Yazilimci y = new Yazilimci("Ahmet", 85000.0, "Java");
y.calis(); // Calisan sınıfından devralınan varsayılan metot çalışır
y.kodYaz(); // Yazilimci sınıfına özel metot

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

// Yönetici nesnesi türetme
Yonetici m = new Yonetici("Mehmet", 120000.0, 15000.0);
m.calis(); // Yonetici sınıfında ezilmiş (@Override) metot çalışır!
m.primEkle();
}
}

---

⚠️ 6. Method Overloading vs Method Overriding 🤼

| Özellik | Method Overloading (Aşırı Yükleme) | Method Overriding (Metot Ezme) |
| :--- | :--- | :--- |
| **Sınıf İlişkisi** | Aynı sınıf içerisinde gerçekleşir. | Üst sınıf ve Alt sınıf arasında gerçekleşir. |
| **Metot İsmi** | Aynıdır. | Aynıdır. |
| **Parametreler** | Farklı olmalıdır (Sayı veya Tip). | Birebir **AYNI** olmalıdır. |
| **Zamanlama** | Derleme zamanı (Compile-time Polymorphism). | Çalışma zamanı (Runtime Polymorphism). |

---

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

Bu bölümde Inheritance (Kalıtım) mantığını, `extends` kullanımını, `super` keyword'ünün rolünü, `@Override` ile metot ezmeyi ve Overloading ile Overriding arasındaki farkları öğrendik.

👉 **Bölüm 10'da Bizi Ne Bekliyor?**
• OOP'nin Üçüncü Ana Temeli: **Polymorphism (Çok Biçimlilik)** 🎭
• Üst Sınıf Referansı İle Alt Sınıf Nesnesi Tutma (Upcasting)
• **`instanceof`** Operatörü ve
Downcasting
• Dinamik Metot Bağlama (Dynamic Method Binding)

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.
136,540Threads
3,306,364Messages
328,378Members
nextaLatest member
Top Bottom