Menu
Coddy logo textTech

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ır

Soyut 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.

challenge icon

Görev

Kolay

Soyut 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 bir brand alanı (String) ve bir wattage alanı (int) vardır. Her iki alanı başlatan bir kurucu, her biri için getter metotları ve şu değeri döndüren normal bir getInfo() metodu ekle: [brand] - [wattage]W. Alt sınıfların uygulaması gereken bir soyut operate() 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 bir capacity alanı (int) bulunur. Üst sınıfın başlatılmasını yönetmek için super kullan. operate() metodunu şu çıktıyı verecek şekilde uygula: [brand] washing machine is washing [capacity]kg of clothes
  • Microwave.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 bir power alanı (int) bulunur. operate() metodunu şu çıktıyı verecek şekilde uygula: [brand] microwave is heating at [power]% power
  • Main.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ı Appliance başvurularından oluşan bir dizide sakla. Dizi üzerinde döngü kur ve her cihaz için önce getInfo() kullanarak bilgilerini yazdır, ardından operate() 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
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi