Abstrakte Klasse Vs. Schnittstelle in Java: Erklärung mit Beispielen

Abstrakte Klassen und Schnittstellen werden zur Abstraktion in Java verwendet. Abstraktion in der objektorientierten Programmierung bezieht sich auf das Verbergen von Implementierungsdetails vor den Endbenutzern.

In der Abstraktion können Sie wissen, was die Funktionalitäten sind, aber Sie können nicht wissen, wie sie implementiert wurden.

Schauen wir uns jeden von ihnen an und versuchen zu verstehen, warum sie verwendet werden.

Abstrakte Klasse

Eine Klasse, die nicht als Objekt instanziiert werden kann und möglicherweise abstrakte Methoden enthält, wird in Java als abstrakte Klasse bezeichnet. Eine abstrakte Methode ist eine Methode, die bei der Deklaration keinen Implementierungsrumpf hat.

Beispiel einer abstrakten Klasse GraphicObject – Oracle

Sie können eine abstrakte Klasse erstellen, indem Sie das Schlüsselwort abstract vor dem Schlüsselwort class angeben.

abstract class abstractClass {
    void run() {
        System.out.println("ran");
    }
}

Eine abstrakte Klasse kann durch andere Klassen erweitert werden. Mit anderen Worten, es kann auch Unterklassen erstellt werden.

abstract class AbstractClass {
    void run() {
        System.out.println("ran");
    }
}

class ExtendingAbstractClass extends AbstractClass {
    void newMethod() {
        System.out.println("new");
    }

    @Override
    void run() {
        System.out.println("override");
    }
}

Abstrakte Klassen werden verwendet, um gemeinsame Methoden zwischen mehreren Klassen zu implementieren, die eine gegebene abstrakte Klasse erweitern. Die Fähigkeit, abstrakte Methoden innerhalb abstrakter Klassen zu definieren, macht sie außerdem unglaublich nützlich für Klassen, die ähnliche Methoden, aber unterschiedliche Implementierungen haben. Nehmen wir ein Beispiel.

Stellen Sie sich ein Auto vor, das über einige Funktionen verfügt, wie z. B. Starten, Stoppen, Rückwärtsfahren usw. Diese Funktionen sind bei allen Arten von Autos gleich.

  12 Sicherheitsfunktionen, die Ihr Webhosting-Anbieter haben sollte

Aber was ist mit Automatisierungsfunktionalitäten wie dem autonomen Fahren? Die Implementierung dieser Funktionalitäten kann für verschiedene Fahrzeugtypen unterschiedlich sein. Sehen wir uns an, wie Sie ein damit zusammenhängendes objektorientiertes Programm erstellen können.

Erstellen Sie zunächst eine Autoklasse, die um mehrere Klassen verschiedener Autotypen erweitert wird.

abstract class Car {
    void start() {
        // implementation
        System.out.println("runs car");
    }

    void stop() {
        // implementation
        System.out.println("engine stops");
    }

    void reverse() {
        // implementation
        System.out.println("reverse mode enabled");
    }

    abstract void selfDrive();
}

Die Methoden start(), stop() und reverse() sind Methoden, die allen Autos gemeinsam sind. Ihre Implementierung ist also bereits in der Car-Klasse selbst definiert. Ein bestimmter Autotyp kann jedoch unterschiedliche Implementierungen des Selbstfahrmodus haben. Und so kann man selfDrive() als abstrakte Methode definieren und in unterschiedlichen Klassen unterschiedlicher Fahrzeugtypen auf unterschiedliche Weise implementieren.

class CarTypeA extends Car {
    @Override
    void start() {
        super.start();
    }

    @Override
    void stop() {
        super.stop();
    }

    @Override
    void reverse() {
        super.reverse();
    }

    void selfDrive() {
        // custom implementation
        System.out.println("Type A self driving mode enabled");
    }
}
class CarTypeB extends Car {
    // ...all similar methods

    void selfDrive() {
        // custom implementation
        // different implementation than CarTypeB
        System.out.println("Type B self driving mode enabled");
    }
}

Es ist wichtig zu beachten, dass, wenn eine Unterklasse nicht alle abstrakten Methoden implementiert, die in der abstrakten Klasse definiert sind, sie selbst als abstrakte Klasse deklariert werden sollte.

Schnittstelle

Eine Schnittstelle ist eine Möglichkeit, einer Klasse mitzuteilen, welche Methoden von ihr implementiert werden müssen. Wenn Sie zum Beispiel das Beispiel eines Autos betrachten, hat es einige grundlegende Funktionen. Es kann starten, sich bewegen und stoppen. Diese Funktionen sind in allen Autos gleich.

  Verbraucht Online-Gaming wirklich eine Menge Bandbreite?

Wenn Sie also eine Schnittstelle eines Autos in einer Klasse implementieren, müssen Sie alle Methoden implementieren, damit das Auto ordnungsgemäß und sicher funktioniert.

Ähnlich wie bei abstrakten Klassen können wir keine Objekte einer Schnittstelle instanziieren oder erstellen. Sie kann als vollständig abstrakte Klasse betrachtet werden, da sie nur abstrakte Methoden enthält, dh Methoden ohne einen Implementierungskörper.

Sie können eine Schnittstelle erstellen, indem Sie das Schlüsselwort interface verwenden.

interface CAR {
    void start();
    void stop();
    void move();
}

Implementieren Sie eine Schnittstelle, indem Sie beim Definieren einer Klasse das Schlüsselwort implements verwenden.

class CarTypeB implements CAR {
    public void start() {
        System.out.println("started");
    }

    public void stop() {
        System.out.println("stopped");
    }

    public void move() {
        System.out.println("running");
    }
}

Ähnlichkeit

Keine Instanziierung als Objekt ist das Einzige, was abstrakte Klassen und Interfaces gemeinsam haben.

Unterschiede

Vererbung und Implementierung von abstrakten Klassenschnittstellen Nur eine abstrakte Klasse kann von einer Klasse geerbt werden. Mehrere Schnittstellen können von einer Klasse implementiert werden. Variablentypen Sie kann finale, nicht finale, statische und nicht statische Variablen haben. Sie kann nur statische und finale Variablen haben. Methodentypen Es kann sowohl abstrakte als auch nicht abstrakte Methoden enthalten. Es kann nur abstrakte Methoden enthalten, aber statische Methoden sind eine Ausnahme. Zugriffsmodifikatoren Eine abstrakte Klasse kann einen Zugriffsmodifikator haben. Die in der Schnittstelle definierten Methodensignaturen sind standardmäßig öffentlich. Eine Schnittstelle hat keinen Zugriffsmodifikator.Konstruktoren und DestruktorenEs kann Konstruktoren und Destruktoren deklarieren.Es kann keine Konstruktoren oder Destruktoren deklarieren.SpeedFastSlowUnterschiede zwischen abstrakter Klasse und Schnittstelle

  So richten Sie die Microsoft Teams Zoom-App ein und verwenden sie

Wann werden abstrakte Klassen und Schnittstellen verwendet?

Verwenden Sie abstrakte Klassen, wenn:

  • Sie möchten einige gemeinsame Methoden und Felder für mehrere Klassen freigeben.
  • Deklarieren von nicht statischen und nicht finalen Feldern, um den Status des Objekts zu ändern, an das sie gebunden sind.

Sie können Schnittstellen verwenden, wenn:

  • Sie möchten das Verhalten einer Klasse definieren, die die Schnittstelle implementiert, aber es interessiert Sie nicht, wie sie implementiert wird.
  • Sie möchten sicherstellen, dass eine Klasse alle Methoden implementiert, um ordnungsgemäß zu funktionieren.

Letzte Worte

Schnittstellen werden hauptsächlich zum Erstellen von APIs verwendet, da sie eine Struktur zum Implementieren von Funktionen bereitstellen können, ohne sich um die tatsächliche Implementierung kümmern zu müssen.

Abstrakte Klassen werden im Allgemeinen verwendet, um gemeinsame abstrakte und nicht abstrakte Methoden unter mehreren Klassen zu teilen, wodurch die abstrakte Klasse erweitert wird, um den Code besser wiederverwendbar zu machen.

Erfahren Sie mehr über Java mit Hilfe dieser Online-Kurse für Java. Bereiten Sie sich auf ein Vorstellungsgespräch zu Java vor? Hier sind einige Interviewfragen zur objektorientierten Programmierung.