Soyut Sınıflar ve Metotlar
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 32 / 87.
Bazen bir taslak görevi gören ancak asla doğrudan örneklendirilmemesi gereken bir sınıf tanımlamak istersiniz. Örneğin, genel bir Shape sınıfı bir ebeveyn olarak mantıklıdır, ancak belirli bir formu olmayan bir "şekil" neye benzer? İşte burada soyut sınıflar (abstract classes) devreye girer.
Bir soyut sınıf (abstract class), abstract anahtar kelimesi ile bildirilir ve örneği oluşturulamaz. Hem uygulamaları olan normal metotları hem de gövdesi olmayan soyut metotları içerebilir:
public abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
// Soyut metot - uygulama yok
public abstract double getArea();
// Normal metot - uygulaması var
public String getColor() {
return color;
}
}Soyut metotlar bir alt sınıfın ne yapması gerektiğini bildirir, ancak nasıl yapacağını bildirmez. Bir soyut sınıfı genişleten soyut olmayan herhangi bir sınıf, tüm soyut metotlar için uygulamalar sağlamalıdır:
public class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}Soyut sınıfları hala referans tipleri olarak kullanabilir ve polimorfizme olanak tanıyabilirsiniz:
Shape shape = new Circle("red", 5.0);
System.out.println(shape.getArea()); // Circle'ın uygulamasını çağırırSoyut sınıflar, alt sınıflar ortak kod paylaştığında ancak her birinin belirli davranışları farklı şekilde uygulaması gerektiğinde idealdir. Kodun yeniden kullanımına izin verirken bir sözleşmeyi zorunlu kılarlar.
Görev
KolaySoyut sınıfların gücünü gösteren bir beyaz eşya sistemi inşa edelim. Her beyaz eşyanın ne yapması gerektiğini tanımlayan temel bir Appliance sınıfı oluşturacaksınız ve belirli beyaz eşya türlerinin bunu tam olarak nasıl yapacağına karar vermesine izin vereceksiniz.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
Appliance.java: Tüm beyaz eşyalar için taslak görevi gören soyut bir sınıf oluşturun. Her beyaz eşyanın birbrandalanı (String) ve birwattagealanı (int) vardır. Her iki alanı da başlatan bir yapıcı (constructor), her biri için getter metotları ve şu formatta bir dize döndüren normal birgetInfo()metodu ekleyin:[brand] - [wattage]W. Alt sınıfların uygulaması gereken soyut biroperate()metodu tanımlayın - bu, her beyaz eşyanın ana işlevini nasıl yerine getirdiğini temsil eder.WashingMachine.java: Appliance sınıfını genişleten somut bir sınıf oluşturun. Çamaşır makinelerinin, kg cinsinden yük miktarını temsil eden ek bircapacityalanı (int) vardır. Üst sınıfın başlatılmasını yönetmek içinsuperkullanın.operate()metodunu şu çıktıyı verecek şekilde uygulayın:[brand] washing machine is washing [capacity]kg of clothesMicrowave.java: Appliance sınıfını genişleten başka bir somut sınıf oluşturun. Mikrodalga fırınların, güç seviyesi yüzdesini temsil eden birpoweralanı (int) vardır.operate()metodunu şu çıktıyı verecek şekilde uygulayın:[brand] microwave is heating at [power]% powerMain.java: Polimorfizm (çok biçimlilik) kullanarak her şeyi bir araya getirin. Beş girdi alacaksınız: bir marka adı, watt değeri, çamaşır makinesi kapasitesi, başka bir marka adı ve mikrodalga güç seviyesi. Bir WashingMachine ve bir Microwave oluşturun, ardından bunları birAppliancereferans dizisinde saklayın. Diziyi döngüye alın ve her beyaz eşya içingetInfo()kullanarak bilgilerini yazdırın, ardındanoperate()metodunu çağırın.
Şu sırayla beş girdi alacaksınız: ilk marka (String), ilk watt değeri (int), kg cinsinden kapasite (int), ikinci marka (String) ve güç seviyesi (int).
Çıktınız dört satır göstermelidir - her beyaz eşya için önce bilgi satırını, ardından çalışma davranışını göreceksiniz. Soyut sınıfın, her biri kendine özgü bir şekilde çalışırken farklı beyaz eşyalara tek tip davranmanıza nasıl izin verdiğine dikkat edin!
Kopya kağıdı
Bir soyut sınıf (abstract class), abstract anahtar kelimesi ile bildirilir ve doğrudan örneklendirilemez. Alt sınıflar için bir taslak görevi görür:
public abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
// Soyut metot - uygulama yok
public abstract double getArea();
// Normal metot - uygulaması var
public String getColor() {
return color;
}
}Soyut metotların gövdesi yoktur ve soyut olmayan alt sınıflar tarafından uygulanmalıdır:
public class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}Soyut sınıflar, polimorfizm (çok biçimlilik) için referans tipleri olarak kullanılabilir:
Shape shape = new Circle("red", 5.0);
System.out.println(shape.getArea()); // Circle'ın uygulamasını çağırırSoyut sınıflar, alt sınıflar ortak kodu paylaştığında ancak belirli davranışları farklı şekilde uygulamaları gerektiğinde idealdir.
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String brand1 = scanner.nextLine();
int wattage1 = scanner.nextInt();
int capacity = scanner.nextInt();
scanner.nextLine(); // yeni satırı tüket
String brand2 = scanner.nextLine();
int power = scanner.nextInt();
// TODO: brand1, wattage1 ve capacity ile bir WashingMachine nesnesi oluşturun
// TODO: brand2, wattage1 (veya uygun wattage) ve power ile bir Microwave nesnesi oluşturun
// TODO: Appliance referanslarından oluşan bir dizi oluşturun ve her iki nesneyi de saklayın
// TODO: Diziyi döngüye alın ve her bir cihaz için:
// - getInfo() kullanarak bilgilerini yazdırın
// - operate() metodunu çağırın
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı