Menu
Coddy logo textTech

Abstrakte Klassen und Methoden

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 32 von 87.

Manchmal möchten Sie eine Klasse definieren, die als Bauplan dient, aber niemals direkt instanziiert werden sollte. Zum Beispiel ist eine generische Shape-Klasse als Elternklasse sinnvoll, aber wie würde eine „Form“ ohne spezifische Gestalt aussehen? Hier kommen abstrakte Klassen ins Spiel.

Eine abstrakte Klasse wird mit dem Schlüsselwort abstract deklariert und kann nicht instanziiert werden. Sie kann sowohl reguläre Methoden mit Implementierungen als auch abstrakte Methoden ohne Rumpf enthalten:

public abstract class Shape {
    protected String color;
    
    public Shape(String color) {
        this.color = color;
    }
    
    // Abstrakte Methode - keine Implementierung
    public abstract double getArea();
    
    // Reguläre Methode - hat eine Implementierung
    public String getColor() {
        return color;
    }
}

Abstrakte Methoden deklarieren, was eine Unterklasse tun muss, aber nicht wie. Jede nicht-abstrakte Klasse, die eine abstrakte Klasse erweitert, muss Implementierungen für alle abstrakten Methoden bereitstellen:

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;
    }
}

Sie können abstrakte Klassen weiterhin als Referenztypen verwenden, was Polymorphismus ermöglicht:

Shape shape = new Circle("red", 5.0);
System.out.println(shape.getArea());  // Ruft die Implementierung von Circle auf

Abstrakte Klassen sind ideal, wenn Unterklassen gemeinsamen Code teilen, aber jeweils bestimmte Verhaltensweisen unterschiedlich implementieren müssen. Sie erzwingen einen Vertrag und ermöglichen gleichzeitig die Wiederverwendung von Code.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Gerätesystem bauen, das die Leistungsfähigkeit abstrakter Klassen demonstriert. Sie erstellen eine Basisklasse Appliance, die definiert, was jedes Gerät tun muss, während die spezifischen Gerätetypen genau entscheiden, wie sie es tun.

Sie werden Ihren Code über vier Dateien organisieren:

  • Appliance.java: Erstellen Sie eine abstrakte Klasse, die als Bauplan für alle Geräte dient. Jedes Gerät hat ein brand-Feld (String) und ein wattage-Feld (int). Fügen Sie einen Konstruktor hinzu, der beide Felder initialisiert, Getter-Methoden für jedes Feld und eine reguläre Methode getInfo(), die Folgendes zurückgibt: [brand] - [wattage]W. Definieren Sie eine abstrakte Methode operate(), die Unterklassen implementieren müssen – diese repräsentiert, wie jedes Gerät seine Hauptfunktion ausführt.
  • WashingMachine.java: Erstellen Sie eine konkrete Klasse, die Appliance erweitert. Waschmaschinen haben ein zusätzliches capacity-Feld (int), das die Ladungsgröße in kg darstellt. Verwenden Sie super, um die Initialisierung der Elternklasse zu handhaben. Implementieren Sie die Methode operate(), um Folgendes auszugeben: [brand] washing machine is washing [capacity]kg of clothes
  • Microwave.java: Erstellen Sie eine weitere konkrete Klasse, die Appliance erweitert. Mikrowellen haben ein power-Feld (int), das den Leistungspegel in Prozent darstellt. Implementieren Sie operate(), um Folgendes auszugeben: [brand] microwave is heating at [power]% power
  • Main.java: Bringen Sie alles unter Verwendung von Polymorphismus zusammen. Sie erhalten fünf Eingaben: einen Markennamen, die Wattzahl, die Kapazität der Waschmaschine, einen weiteren Markennamen und den Leistungspegel der Mikrowelle. Erstellen Sie eine WashingMachine und eine Microwave und speichern Sie diese dann in einem Array von Appliance-Referenzen. Durchlaufen Sie das Array in einer Schleife und geben Sie für jedes Gerät seine Informationen mit getInfo() aus, gefolgt vom Aufruf von operate().

Sie erhalten fünf Eingaben in dieser Reihenfolge: erste Marke (String), erste Wattzahl (int), Kapazität in kg (int), zweite Marke (String) und Leistungspegel (int).

Ihre Ausgabe sollte vier Zeilen zeigen – für jedes Gerät sehen Sie seine Info-Zeile, gefolgt von seinem Betriebsverhalten. Beachten Sie, wie die abstrakte Klasse es Ihnen ermöglicht, verschiedene Geräte einheitlich zu behandeln, während jedes auf seine eigene, einzigartige Weise arbeitet!

Spickzettel

Eine abstrakte Klasse wird mit dem Schlüsselwort abstract deklariert und kann nicht direkt instanziiert werden. Sie dient als Bauplan für Unterklassen:

public abstract class Shape {
    protected String color;
    
    public Shape(String color) {
        this.color = color;
    }
    
    // Abstrakte Methode - keine Implementierung
    public abstract double getArea();
    
    // Reguläre Methode - hat eine Implementierung
    public String getColor() {
        return color;
    }
}

Abstrakte Methoden haben keinen Rumpf und müssen von nicht-abstrakten Unterklassen implementiert werden:

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;
    }
}

Abstrakte Klassen können als Referenztypen für Polymorphismus verwendet werden:

Shape shape = new Circle("red", 5.0);
System.out.println(shape.getArea());  // Ruft die Implementierung von Circle auf

Abstrakte Klassen sind ideal, wenn Unterklassen gemeinsamen Code teilen, aber bestimmte Verhaltensweisen unterschiedlich implementieren müssen.

Probier es selbst

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Eingaben lesen
        String brand1 = scanner.nextLine();
        int wattage1 = scanner.nextInt();
        int capacity = scanner.nextInt();
        scanner.nextLine(); // Zeilenumbruch konsumieren
        String brand2 = scanner.nextLine();
        int power = scanner.nextInt();
        
        // TODO: Erstelle ein WashingMachine Objekt mit brand1, wattage1 und capacity
        
        // TODO: Erstelle ein Microwave Objekt mit brand2, wattage1 (oder entsprechender Wattzahl) und power
        
        // TODO: Erstelle ein Array von Appliance Referenzen und speichere beide Objekte
        
        // TODO: Iteriere durch das Array und für jedes Gerät:
        // - Gib seine Informationen mit getInfo() aus
        // - Rufe operate() auf
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung