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 plan görevi gören ancak hiçbir zaman doğrudan örneği oluşturulmaması gereken bir sınıf tanımlamak istersin. Örneğin, genel bir Shape sınıfı üst sınıf olarak anlamlıdır; ancak belirli bir biçimi olmayan bir "şekil" nasıl görünürdü? İşte soyut sınıflar burada devreye girer.
Bir soyut sınıf, abstract anahtar sözcüğüyle bildirilir ve örneği oluşturulamaz. Hem uygulamaları bulunan normal yöntemleri hem de gövdesi olmayan soyut yöntemleri 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 cihaz sistemi oluşturalım. Her cihazın ne yapması gerektiğini tanımlayan bir temel Appliance sınıfı oluşturacak, belirli cihaz türlerinin bunu tam olarak nasıl yapacaklarına karar vermesine izin vereceksin.
Kodunu dört dosyaya ayıracaksın:
Appliance.java: Tüm cihazlar için şablon görevi gören bir soyut sınıf oluştur. Her cihazın birbrandalanı (String) ve birwattagealanı (int) vardır. Her iki alanı başlatan bir kurucu, her biri için getter metotları ve şu değeri döndüren normal birgetInfo()metodu ekle:[brand] - [wattage]W. Alt sınıfların uygulaması gereken bir soyutoperate()metodu tanımla — bu, her cihazın ana işlevini nasıl gerçekleştirdiğini temsil eder.WashingMachine.java: Appliance sınıfını genişleten somut bir sınıf oluştur. Çamaşır makinelerinde, kg cinsinden yük boyutunu temsil eden ek bircapacityalanı (int) bulunur. Üst sınıfın başlatılmasını yönetmek içinsuperkullan.operate()metodunu şu çıktıyı verecek şekilde uygula:[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ştur. Mikrodalgalarda, güç düzeyini yüzde olarak temsil eden birpoweralanı (int) bulunur.operate()metodunu şu çıktıyı verecek şekilde uygula:[brand] microwave is heating at [power]% powerMain.java: Çok biçimliliği kullanarak her şeyi bir araya getir. Beş girdi alacaksın: bir marka adı, watt değeri, çamaşır makinesi kapasitesi, başka bir marka adı ve mikrodalga güç düzeyi. Bir WashingMachine ve bir Microwave oluştur, ardından bunlarıAppliancebaşvurularından oluşan bir dizide sakla. Dizi üzerinde döngü kur ve her cihaz için öncegetInfo()kullanarak bilgilerini yazdır, ardındanoperate()metodunu çağır.
Beş girdiyi şu sırayla alacaksın: ilk marka (String), ilk watt değeri (int), kg cinsinden kapasite (int), ikinci marka (String) ve güç düzeyi (int).
Çıktın dört satır göstermeli — her cihaz için önce bilgi satırını, ardından çalışma davranışını göreceksin. Soyut sınıfın farklı cihazları nasıl tek tip biçimde ele almanı sağladığına, her birinin ise kendine özgü şekilde çalıştığına dikkat et!
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ıKendi başına pratik yap: Online Java derleyicisi