Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse in Java

Mohammad Irfan 12 Oktober 2023
  1. Ähnlichkeiten zwischen abstrakter Klasse und Schnittstelle
  2. Unterschiede zwischen abstrakter Klasse und Schnittstelle
  3. Wann sollten abstrakte Klasse und Schnittstelle verwendet werden?
  4. Abstrakte Klasse in Java
  5. Schnittstelle in Java
  6. Abstrakte Klasse, die eine Schnittstelle implementiert
  7. Zusammenfassung
Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse in Java

Dieses Tutorial stellt den Unterschied zwischen einer Interface- und einer abstrakten Klasse in Java vor und listet auch einige Beispielcodes auf, um das Thema zu verstehen.

Abstraktion ist der Prozess, die Implementierung zu verbergen und dem Benutzer nur wesentliche Details zur Verfügung zu stellen. Abstraktion in Java wird über abstrakte Klassen und Schnittstellen erreicht. Abstrakte Klassen und Interfaces haben ein paar Dinge gemeinsam, aber es gibt große Unterschiede zwischen ihnen. Lassen Sie uns zunächst einige der Dinge durchgehen, die zwischen den beiden ähnlich sind.

Ähnlichkeiten zwischen abstrakter Klasse und Schnittstelle

  • Wie oben besprochen, werden sowohl abstrakte Klasse als auch Schnittstelle für die Abstraktion verwendet.
  • Abstrakte Klassen und Interfaces können nicht instanziiert werden, d.h. wir können für sie kein Objekt erstellen.
  • Unterklassen müssen die abstrakten Methoden überschreiben, die in der abstrakten Klasse oder Schnittstelle definiert sind.

Die obigen Punkte fassen die Ähnlichkeiten zwischen den beiden ziemlich gut zusammen. Schauen wir uns nun einige der wichtigsten Unterschiede zwischen ihnen an.

Unterschiede zwischen abstrakter Klasse und Schnittstelle

Abstrakte Klasse Schnittstelle
Das Schlüsselwort abstract in Java wird verwendet, um eine abstrakte Klasse zu erstellen oder zu deklarieren. In Java wird das Schlüsselwort interface verwendet, um eine neue Schnittstelle zu erstellen oder zu deklarieren.
Eine Klasse kann die Eigenschaften und Methoden einer abstrakten Klasse erben, indem sie das Schlüsselwort extends verwendet. Um ein Interface in Java zu implementieren, können wir das Schlüsselwort implements verwenden.
In einer abstrakten Klasse können abstrakte oder nicht abstrakte Methoden definiert sein. Abstrakte Methoden sind diejenigen, für die keine Implementierung vorgesehen ist. Eine Schnittstelle kann nur abstrakte Methoden enthalten. Wir können nur die Methodendefinition bereitstellen, aber nicht ihre Implementierung. Nach Java 8 können wir auch Standard- und statische Methoden in Interfaces haben.
Eine abstrakte Klasse kann finale oder nicht finale Variablen (Klassenattribute) enthalten. Es kann auch statische oder nicht statische Attribute enthalten. Eine Schnittstelle kann nur statische und finale Member enthalten, und kein anderer Membertyp ist zulässig.
Eine abstrakte Klasse kann eine Schnittstelle implementieren und die Methoden der Schnittstelle implementieren. Eine Schnittstelle kann keine andere Klasse erweitern und kann keine abstrakten Klassenmethoden überschreiben oder implementieren.
Eine abstrakte Klasse kann andere Klassen erweitern und auch Schnittstellen implementieren. Wie im vorherigen Punkt besprochen, können Schnittstellen andere Klassen nicht erweitern. Es gibt jedoch keine Einschränkung bei der Implementierung einer Schnittstelle.
Java unterstützt keine Mehrfachvererbung über Klassen. Abstrakte Klassen unterstützen wie jede andere Klasse keine Mehrfachvererbung. Die Unterstützung für Mehrfachvererbungen in Java wird über Schnittstellen bereitgestellt. Dies liegt daran, dass Schnittstellen eine vollständige Abstraktion bieten.
Zusammenfassung Klassenmitglieder oder Attribute können privat, geschützt oder öffentlich sein. Attribute oder Member einer Schnittstelle sind immer öffentlich.

Wann sollten abstrakte Klasse und Schnittstelle verwendet werden?

Abstrakte Klassen können eine teilweise oder vollständige Abstraktion bereitstellen. Schnittstellen hingegen bieten immer eine vollständige Abstraktion. Eine abstrakte Elternklasse kann für einige wenige Klassen erstellt werden, die einige gemeinsame Funktionalitäten haben. Abstrakte Klassen werden auch bevorzugt, wenn Sie mehr Handlungsfreiheit wünschen.

Schnittstellen werden bevorzugt, wenn wir eine Grundstruktur definieren wollen. Der Programmierer kann dann alles mit dieser Struktur bauen. Schnittstellen unterstützen auch Mehrfachvererbungen. Eine einzelne Klasse kann also mehrere Schnittstellen implementieren.

Insgesamt ist es eine Frage der Wahl und der Aufgabe, die erfüllt werden muss. Sowohl die abstrakte Klasse als auch das Interface sind für unterschiedliche Zwecke geeignet und sollten entsprechend verwendet werden.

Abstrakte Klasse in Java

Lassen Sie uns eine abstrakte Klasse erstellen und untergeordnete Klassen erstellen, die sie erweitern, um die abstrakte Klasse und ihre Funktionen zu verstehen.

abstract class Bell {
  protected String sound;

  Bell() {
    this.sound = "ting";
  }
  // Abstract Method
  abstract public void ring();

  // Non-Abstract Methods
  public void increaseVolume() {
    System.out.println("Increasing Volume");
  }

  public void decreaseVolume() {
    System.out.println("Decreasing Volume");
  }
}
class SchoolBell extends Bell {
  @Override
  public void ring() {
    System.out.println("Ringing the School bell: " + sound);
  }
}
class ChruchBell extends Bell {
  @Override
  public void ring() {
    System.out.println("Ringing the Chruch Bell: " + sound);
  }
}
public class AbstractClassDemo {
  public static void main(String[] args) {
    SchoolBell sb = new SchoolBell();
    ChruchBell cb = new ChruchBell();

    // Using the overridden methods
    sb.ring();
    cb.ring();

    // Using the non-abstract methods of Bell class
    sb.increaseVolume();
    cb.decreaseVolume();
  }
}

Ausgabe:

Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume
Decreasing Volume

Schnittstelle in Java

Lassen Sie uns das gleiche Szenario mithilfe von Schnittstellen replizieren. Wir können in der Schnittstelle keine nicht-abstrakten Methoden mehr definieren. Interface ist die richtige Wahl, wenn die Klassen keine gemeinsame Implementierung der Methoden increaseVolume() und decreaseVolume() wünschen.

interface Bell {
  String sound = "ting";
  // only abstract methods allowed in interface
  public void ring();
  public void increaseVolume();
  public void decreaseVolume();
}
class SchoolBell implements Bell {
  public void ring() {
    System.out.println("Ringing the School bell: " + sound);
  }
  @Override
  public void increaseVolume() {
    System.out.println("Increasing Volume of School Bell");
  }
  @Override
  public void decreaseVolume() {
    System.out.println("Decreasing Volume of School Bell");
  }
}
class ChruchBell implements Bell {
  public void ring() {
    System.out.println("Ringing the Chruch Bell: " + sound);
  }
  @Override
  public void increaseVolume() {
    System.out.println("Increasing Volume of Chruch Bell");
  }
  @Override
  public void decreaseVolume() {
    System.out.println("Decreasing Volume of Chruch Bell");
  }
}
public class InterfaceDemo {
  public static void main(String[] args) {
    SchoolBell sb = new SchoolBell();
    ChruchBell cb = new ChruchBell();

    // Using the overridden methods
    sb.ring();
    cb.ring();

    // Using the non-abstract methods of Bell class
    sb.increaseVolume();
    cb.decreaseVolume();
  }
}

Ausgabe:

Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume of School Bell
Decreasing Volume of Chruch Bell

Abstrakte Klasse, die eine Schnittstelle implementiert

Wie im vorherigen Abschnitt besprochen, können wir die Methoden eines Interfaces in einer abstrakten Klasse implementieren. Der folgende Code demonstriert dies.

interface Bell {
  String sound = "ting";
  // only abstract methods allowed in interface
  public void ring();
  public void increaseVolume();
  public void decreaseVolume();
}
abstract class AbstractBell implements Bell {
  public void increaseVolume() {
    System.out.println("Increasing Volume");
  }
  public void decreaseVolume() {
    System.out.println("Decreasing Volume");
  }
}

Zusammenfassung

Abstraktion ist eines der grundlegendsten Konzepte in der objektorientierten Programmierung. Abstraktion wird verwendet, um die Implementierung zu verbergen und dem Benutzer nur die minimalen wesentlichen Details zur Verfügung zu stellen. In Java wird die Abstraktion durch die Verwendung abstrakter Klassen oder Schnittstellen erreicht. Ein wesentlicher Unterschied zwischen den beiden besteht darin, dass abstrakte Klassen auch eine teilweise Abstraktion bereitstellen können, während Interface immer eine vollständige Abstraktion bereitstellt. In diesem Tutorial haben wir einige der wichtigsten Unterschiede zwischen den beiden besprochen.

Verwandter Artikel - Java Interface