Dieser Artikel erklärt den Unterschied zwischen abstrakten Klassen und Schnittstellen in Java: 1. Unterschiede auf der Syntaxebene 2. Unterschiede auf der Designebene.
1. Unterschiede auf Syntaxebene
1) Abstrakte Klassen können Implementierungsdetails von Mitgliedsmethoden bereitstellen, während in Schnittstellen nur öffentliche abstrakte Methoden vorhanden sein können; Mitgliedsvariablen in einer Klasse können von unterschiedlichem Typ sein, während Mitgliedsvariablen in einer Schnittstelle nur vom öffentlichen statischen Endtyp sein können
3) Schnittstellen können keine statischen Codeblöcke und statischen Methoden enthalten, während abstrakte Klassen dies können statische Codeblöcke und statische Methoden;
4) Eine Klasse kann nur eine abstrakte Klasse erben, aber eine Klasse kann mehrere Schnittstellen implementieren.
2. Unterschiede auf Designebene
1) Eine abstrakte Klasse ist eine Abstraktion einer Sache, also eine Abstraktion einer Klasse, während eine Schnittstelle eine Abstraktion des Verhaltens ist. Eine abstrakte Klasse abstrahiert die gesamte Klasse, einschließlich Attributen und Verhaltensweisen, während eine Schnittstelle einen Teil der Klasse (Verhalten) abstrahiert. Um ein einfaches Beispiel zu nennen: Flugzeuge und Vögel sind verschiedene Arten von Dingen, aber eines haben sie alle gemeinsam: Sie können fliegen. Beim Entwerfen können Sie also ein Flugzeug als Flugzeugähnlich und einen Vogel als Vogelähnlich entwerfen, aber Sie können das Merkmal des Fliegens nicht als Klasse entwerfen, es handelt sich also nur um ein Verhaltensmerkmal und nicht um eine abstrakte Beschreibung eines Klasse der Dinge. Zu diesem Zeitpunkt kann der Flug als Schnittstelle Fly entworfen werden, einschließlich der Methode fly (), und dann implementieren Airplane und Bird die Fly-Schnittstelle entsprechend ihren eigenen Anforderungen. Dann können verschiedene Flugzeugtypen, wie Kampfflugzeuge, Zivilflugzeuge usw., die Klasse „Flugzeug“ direkt erben. Das Gleiche gilt für Vögel. Daraus ist ersichtlich, dass die Vererbung eine „Ist es“-Beziehung ist, während die Schnittstellenimplementierung eine „Ist es“-Beziehung ist. Wenn eine Klasse eine abstrakte Klasse erbt, muss die Unterklasse vom Typ der abstrakten Klasse sein und die Schnittstellenimplementierung hängt davon ab, ob sie existiert oder nicht. Ob ein Vogel beispielsweise fliegen kann (oder ob er die Eigenschaft hat, zu fliegen). , ob es fliegen kann Dann können Sie diese Schnittstelle implementieren. Wenn Sie nicht fliegen können, können Sie diese Schnittstelle nicht implementieren.
2) Die Entwurfsebene ist unterschiedlich. Die abstrakte Klasse ist die übergeordnete Klasse vieler Unterklassen und ein Vorlagendesign. Die Schnittstelle ist eine Verhaltensspezifikation und ein radiales Design. Was ist Template-Design? Das einfachste Beispiel ist, dass jeder Vorlagen in PPT verwendet hat. Wenn PPT B und PPT C mit Vorlage A entworfen wurden, ist der gemeinsame Teil von PPT B und PPT C Vorlage A. Wenn ihre gemeinsamen Teile geändert werden müssen, müssen sie nur geändert werden Vorlage A reicht aus, ppt B und ppt C müssen nicht erneut geändert werden. Beim Radialdesign ist beispielsweise ein bestimmter Aufzug mit einer Art Alarm ausgestattet. Sobald die Alarme aktualisiert sind, müssen alle Alarme aktualisiert werden. Das heißt, wenn Sie bei abstrakten Klassen neue Methoden hinzufügen müssen, können Sie der abstrakten Klasse direkt spezifische Implementierungen hinzufügen, und die Unterklassen müssen nicht geändert werden. Bei Schnittstellen ist dies jedoch nicht möglich Wird eine Änderung vorgenommen, sind alle Implementierungen dieser Schnittstelle betroffen. Klassen müssen entsprechend geändert werden.
Schauen wir uns eines der am weitesten verbreiteten Beispiele im Internet an: das Tür- und Alarmbeispiel: Die Tür hat zwei Aktionen: open() und close(). Zu diesem Zeitpunkt können wir diese Abstraktion durch definieren abstrakte Klassen und Schnittstellen. Konzept:
abstract class Door {
public abstract void open(); public abstract void close();
}
Oder:
interface Door {
public abstract void open(); public abstract void close();
}
Aber wenn wir nun brauchen, dass die Tür über die Funktion alarm() verfügt, wie implementieren wir sie? Im Folgenden werden zwei Ideen bereitgestellt:
1) Fügen Sie diese drei Funktionen in die abstrakte Klasse ein, aber auf diese Weise haben alle von dieser abstrakten Klasse geerbten Unterklassen die Alarmfunktion, einige Türen jedoch nicht. Dies ist nicht unbedingt der Fall Alarmfunktion;
2) Fügen Sie diese drei Funktionen in die Schnittstelle ein. Die Klasse, die die Alarmfunktion verwenden muss, muss open() und close() in dieser Schnittstelle implementieren ()- und close()-Funktionen überhaupt, wie zum Beispiel Feueralarme.
Daraus ist ersichtlich, dass open(), close() und alarm() grundsätzlich zu zwei verschiedenen Verhaltenskategorien gehören. open() und close() gehören zu den inhärenten Verhaltensmerkmalen der Tür selbst und alarm() ist ein erweitertes zusätzliches Verhalten. Daher besteht die beste Lösung darin, den Alarm als separate Schnittstelle zu entwerfen, einschließlich des alarm()-Verhaltens, und die Tür als separate abstrakte Klasse zu entwerfen, einschließlich des Öffnungs- und Schließverhaltens. Entwerfen Sie dann eine Alarmtür, die die Türklasse erbt und die Alarmschnittstelle implementiert.
Schnittstelle Alram {
void alarm();
}
abstrakte Klasse Tür {
void open(); void close();
}
Klasse AlarmDoor erweitert Tür implementiert Alarm {
void oepn() { //.... } void close() { //.... } void alarm() { //.... }
}
Verwandte Artikel:
Der Unterschied zwischen Schnittstellen und abstrakten Klassen, der Unterschied zwischen abstrakten Schnittstellenklassen Java-Schnittstellen und abstrakte KlassenDas obige ist der detaillierte Inhalt vonDer Unterschied zwischen abstrakten Klassen und Schnittstellen in Java auf Syntax- und Designebene. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!