🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-11: Abstraction (Soyutlama), Abstract Class ve Interface 🎨

🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-11: Abstraction (Soyutlama), Abstract Class ve Interface 🎨

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

Önceki bölümde OOP’nin üçüncü ana temeli olan Polymorphism (Çok Biçimlilik) ilkesini, Upcasting/Downcasting işlemlerini ve `instanceof` operatörünü görmüştük. Bu bölümde ise OOP’nin dördüncü ve son ana sütunu olan **Abstraction (Soyutlama)** kavramını, **Abstract Class (Soyut Sınıf)** ve **Interface (Arayüz)** mimarilerini detaylarıyla inceleyeceğiz.

---

📌 1. Abstraction (Soyutlama) Nedir? 🎭

Soyutlama; bir sistemin karmaşık uygulama detaylarını gizleyip, kullanıcıya veya alt sınıflara sadece **"Ne yapılacağını" (What to do)** sunma, **"Nasıl yapılacağını" (How to do)** ise alt sınıflara bırakma ilkesidir.

Örnek Analoji:
Bir arabanın gaz pedalına bastığınızda araba hızlanır. Pedal size "Hızlan" sözleşmesi sunar. Ancak motorun içinde benzinin nasıl tutuştuğu, pistonların nasıl hareket ettiği detaylarıyla ilgilenmezsiniz.

Java'da soyutlama 2 ana yapı ile sağlanır:
1. **Soyut Sınıflar (Abstract Classes):** Kısmi soyutlama (%0 - %100 arası).
2. **Arayüzler (Interfaces):** Tam soyutlama (%100 - Java 8 öncesi tam soyutlama sunardı).

---

🏗️ 2. Abstract Class (Soyut Sınıf) ve `abstract` Metotlar 🏛️

`abstract` anahtar kelimesi ile tanımlanan sınıflardır.

### Abstract Class Özellikleri:
• **`new` anahtar kelimesi ile NESNESİ TÜRETİLEMEZ!** (Doğrudan `new SoyutSinif()` denemez).
• Hem gövdeli (somut/concrete) metotlar hem de gövdesiz (`abstract`) metotlar içerebilir.
• `abstract` metotların gövdesi `{}` yoktur; alt sınıflar bu metotları **ezmek (`@Override`) ZORUNDADIR.**

### Örnek (`Sekil.java`, `Daire.java`, `Dikdortgen.java`):

// Soyut Sınıf
abstract class Sekil {
private String renk;

public Sekil(String renk) {
this.renk = renk;
}

// Gövdesiz Soyut Metot (Alt sınıflar kendine göre hesaplamak ZORUNDA)
public abstract double alanHesapla();

// Gövdeli Somut Metot (Ortak kullanılabilir)
public void rengiYazdir() {
System.out.println("Şeklin Rengi: " + renk);
}

public String getRenk() { return renk; }
}

// Alt Sınıf 1
class Daire extends Sekil {
private double yaricap;

public Daire(String renk, double yaricap) {
super(renk);
this.yaricap = yaricap;
}

@Override
public double alanHesapla() {
return Math.PI * yaricap * yaricap;
}
}

// Alt Sınıf 2
class Dikdortgen extends Sekil {
private double en;
private double boy;

public Dikdortgen(String renk, double en, double boy) {
super(renk);
this.en = en;
this.boy = boy;
}

@Override
public double alanHesapla() {
return en * boy;
}
}

---

🔌 3. Interface (Arayüz) Mimarisi ve `implements` 🌐

Interface, bir sınıfın hangi davranışları üstlenmesi gerektiğini belirten **teknik bir sözleşmedir (contract).**

### Interface Özellikleri:
• `interface` anahtar kelimesi ile tanımlanır, sınıflar tarafından **`implements`** edilir.
• İçindeki tüm değişkenler varsayılan olarak `public static final` (sabit) kabul edilir.
• Metotları varsayılan olarak `public abstract` (gövdesiz) kabul edilir.
• **Çoklu Kalıtım Desteği:** Bir sınıf birden fazla Interface'i aynı anda `implements` edebilir!

### Örnek Ödeme Sistemi (`OdemeYontemi.java`, `KrediKarti.java`):

interface OdemeYontemi {
// Sözleşme Metodu
boolean odemeYap(double miktar);
}

interface BildirimGonderici {
void dekontGonder(String eposta);
}

// Çoklu Interface Uygulama (Multiple Implementation)
class KrediKarti implements OdemeYontemi, BildirimGonderici {
private String kartNumarasi;

public KrediKarti(String kartNumarasi) {
this.kartNumarasi = kartNumarasi;
}

@Override
public boolean odemeYap(double miktar) {
System.out.println(kartNumarasi + " kartından " + miktar + " TL çekildi. ✅");
return true;
}

@Override
public void dekontGonder(String eposta) {
System.out.println("Dekont " + eposta + " adresine e-posta atıldı. 📧");
}
}

---

🧪 4. Abstraction Kullanımı (`Main.java`) 🚀

public class Main {
public static void main(String[] args) {
// Abstract Class Kullanımı (Polymorphism ile)
Sekil s1 = new Daire("Kırmızı", 5.0);
Sekil s2 = new Dikdortgen("Mavi", 4.0, 6.0);

s1.rengiYazdir();
System.out.println("Daire Alanı: " + s1.alanHesapla());

s2.rengiYazdir();
System.out.println("Dikdörtgen Alanı: " + s2.alanHesapla());

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

// Interface Kullanımı
KrediKarti kart = new KrediKarti("4543-XXXX-XXXX-1234");
kart.odemeYap(1500.0);
kart.dekontGonder("[email protected]");
}
}

---

⚖️ 5. Abstract Class vs Interface Karşılaştırması 📊

| Özellik | Abstract Class | Interface |
| :--- | :--- | :--- |
| **Kalıtım / Bağlantı** | `extends` ile miras alınır. | `implements` ile uygulanır. |
| **Çoklu Kalıtım** | Tek bir sınıftan türetilebilir. | Sınıf birden fazla Interface uygulayabilir. |
| **Değişkenler** | Her türlü değişken (`private`, `protected`, `int` vs) tutabilir. | Sadece `public static final` sabit tutar. |
| **Constructor** | Constructor içerebilir. | Constructor İÇEREMEZ. |
| **Mantıksal İlişki** | "IS-A" (Bir türüdür) ilişkisi kurar (`Daire` bir `Sekil`dir). | "CAN-DO" (Yapabilir) yetenek ilişkisi kurar (`KrediKarti` ödeme yapabilir). |

---

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

Bu bölümde Abstraction ilkesini, Abstract Class kullanımını, Interface yapısını ve aralarındaki kritik farkları öğrendik. Böylece Java'da Nesne Yönelimli Programlamanın (OOP) 4 ana temelini de başarıyla tamamlamış olduk! 🎉

👉 **Bölüm 12'de Bizi Ne Bekliyor?**
• Diziler (Arrays) ve Çok Boyutlu Diziler 📊
• Dizi Elemanlarını Manipüle Etme
• **`Arrays` Yardımcı Sınıfı** (`Arr
ays.sort()`, `Arrays.toString()`, `Arrays.binarySearch()`)
• Gelişmiş `for-each` Döngüsü

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,078Konular
3,298,003Mesajlar
326,267Kullanıcılar
dmrhanSon Üye
Üst Alt