-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
🚀 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! ☕✨
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