İçeriğe geç

Abstract Class (Soyut Sınıflar)

abstract (soyut) sınıflar, tamamlanmamış (gövdesiz) metotlar içerebilir.
Soyut sınıflar örneklenemez (nesne oluşturulamaz) ve genellikle alt sınıflar için temel yapı sağlar.

💡 Bir sınıfın “ne yapılacağını” değil, “nasıl yapılacağını” alt sınıflara bırakmak için kullanılır.


abstract class Hayvan {
abstract void sesCikar(); // soyut metot
}

Alt sınıf, abstract sınıfı extends eder ve soyut metotları override etmek zorundadır.

abstract class Hayvan {
abstract void sesCikar();
}
class Kedi extends Hayvan {
void sesCikar() {
System.out.println("Miyav!");
}
}

💡 Kedi sınıfı, sesCikar() metodunu zorunlu olarak uygulamak zorundadır.


🔹 4. Abstract Sınıfta Normal Metotlar

Section titled “🔹 4. Abstract Sınıfta Normal Metotlar”

Abstract sınıflar hem soyut hem de normal metotlara sahip olabilir.

abstract class Arac {
abstract void calistir();
void durdur() {
System.out.println("Araç durduruldu.");
}
}
class Araba extends Arac {
void calistir() {
System.out.println("Araba çalıştı.");
}
}

Hayvan h = new Hayvan(); // ❌ HATA — Soyut sınıflardan nesne oluşturulamaz

Soyut sınıfların constructor’ı olabilir, ancak doğrudan çağrılamaz.
Alt sınıflar super() ile bu constructor’a erişebilir.

abstract class Hayvan {
Hayvan() {
System.out.println("Hayvan oluşturuldu.");
}
}
class Kedi extends Hayvan {
Kedi() {
System.out.println("Kedi oluşturuldu.");
}
}
public class Main {
public static void main(String[] args) {
new Kedi();
}
}

Çıktı:
Hayvan oluşturuldu.
Kedi oluşturuldu.


KuralAçıklama
Soyut metot gövde içeremezabstract void sesCikar();
Abstract sınıfta olmalıdırNormal sınıfta bulunamaz
Alt sınıfta override edilmelidirZorunlu
static, final veya private olamazÇünkü override edilemez

abstract class Sekil {
abstract double alanHesapla();
void bilgi() {
System.out.println("Bu bir geometrik şekildir.");
}
}
class Dikdortgen extends Sekil {
double genislik, yukseklik;
Dikdortgen(double g, double y) {
genislik = g;
yukseklik = y;
}
double alanHesapla() {
return genislik * yukseklik;
}
}
Sekil s = new Dikdortgen(5, 3);
System.out.println("Alan: " + s.alanHesapla());

ÖzellikAbstract ClassInterface
Anahtar kelimeabstractinterface
Gövdeli metot✅ Olabilir✅ (default ile)
Çoklu kalıtım
Değişken tipiNormal veya finalpublic static final
Constructor✅ Var❌ Yok
AmaçOrtak yapı / temel sınıfDavranış tanımı

abstract class Sekil {
abstract void ciz();
}
class Daire extends Sekil {
void ciz() {
System.out.println("Daire çiziliyor.");
}
}
class Ucgen extends Sekil {
void ciz() {
System.out.println("Üçgen çiziliyor.");
}
}
public class Main {
public static void main(String[] args) {
Sekil s1 = new Daire();
Sekil s2 = new Ucgen();
s1.ciz();
s2.ciz();
}
}

💡 Her alt sınıf, kendi davranışını (override edilen metot) uygular.


🔹 11. Abstract Sınıf ile Final Metot Kullanımı

Section titled “🔹 11. Abstract Sınıf ile Final Metot Kullanımı”

Soyut sınıfta bazı metotlar final olabilir. Bu durumda alt sınıflar bu metodu ezemez.

abstract class Hayvan {
final void nefesAl() {
System.out.println("Hayvan nefes alıyor.");
}
}

abstract class Odeme {
abstract void odemeYap(double miktar);
}
class NakitOdeme extends Odeme {
void odemeYap(double miktar) {
System.out.println("Nakit ödeme: " + miktar + " TL");
}
}
class KrediKartiOdeme extends Odeme {
void odemeYap(double miktar) {
System.out.println("Kredi kartıyla ödeme: " + miktar + " TL");
}
}
public class Main {
public static void main(String[] args) {
Odeme o1 = new NakitOdeme();
Odeme o2 = new KrediKartiOdeme();
o1.odemeYap(150.0);
o2.odemeYap(300.0);
}
}

KavramAçıklamaÖrnek
abstract classSoyut sınıf, doğrudan örneklenemezabstract class Hayvan
abstract methodGövdesiz metot, alt sınıfta ezilmeliabstract void sesCikar();
extendsAbstract sınıfı kalıtmak içinclass Kedi extends Hayvan
PolymorphismFarklı sınıflar, aynı metodu farklı şekilde uygularSekil.ciz()

💡 Not: abstract sınıflar, interface’lere göre daha fazla esneklik sağlar; hem gövdeli hem soyut metotları destekler.