Für die objektorientierte Programmierung ist Abstraktion eines ihrer Hauptmerkmale. In Java kann die OOP -Abstraktion in zwei Formen reflektiert werden: Schnittstellen und abstrakte Klassen. Es gibt zu viele Ähnlichkeiten und zu viele Unterschiede zwischen den beiden. Viele Leute denken, dass sie bei Anfängern synonym eingesetzt werden können, aber tatsächlich nicht. Heute erfahren wir über Schnittstellen und abstrakte Klassen in Java. Hier ist der Verzeichnisriss dieses Artikels:
1.. Zusammenfassung Klasse
2. Schnittstelle
3. Der Unterschied zwischen abstrakten Klassen und Schnittstellen
1.. Zusammenfassung Klasse
Bevor Sie abstrakte Klassen verstehen, verstehen wir zunächst abstrakte Methoden. Eine abstrakte Methode ist eine spezielle Methode: Sie hat nur Deklarationen, aber keine konkrete Implementierung. Das Deklarationsformat einer abstrakten Methode lautet:
abstrakter void Fun ();
Abstrakte Methoden müssen mit dem abstrakten Schlüsselwort geändert werden. Wenn eine Klasse abstrakte Methoden enthält, wird diese Klasse als abstrakte Klasse bezeichnet. Die abstrakte Klasse muss vor der Klasse mit dem abstrakten Schlüsselwort geändert werden. Da abstrakte Klassen Methoden ohne konkrete Implementierungen enthalten, können Objekte nicht mit abstrakten Klassen erstellt werden.
Ein Problem sollte unten festgestellt werden: In dem Buch "Java Programming Denk" werden abstrakte Klassen als "Klassen mit abstrakten Methoden" definiert. Später wurde jedoch festgestellt, dass wenn eine Klasse keine abstrakten Methoden enthält und nur mit Abstract modifiziert ist, auch eine abstrakte Klasse ist. Mit anderen Worten, abstrakte Klassen müssen nicht unbedingt abstrakte Methoden enthalten. Ich persönlich denke, dies ist eine hartnäckige Frage, denn wenn eine abstrakte Klasse keine abstrakten Methoden enthält, warum sollte sie dann als abstrakte Klasse entworfen werden? Denken Sie also vorerst an dieses Konzept, und es ist nicht nötig, sich darauf zu befassen, warum.
[public] Abstract Class ClassName {Abstract void Fun ();}Daraus können wir sehen, dass abstrakte Klassen zur Vererbung existieren. Wenn Sie eine abstrakte Klasse definieren, sie aber nicht erben, ist es gleichwertig, diese abstrakte Klasse vergebens zu erstellen, da Sie sie nicht verwenden können, um etwas zu tun. Wenn eine übergeordnete Klasse in der übergeordneten Klasse implementiert wird, hat eine ihrer Methoden keine Bedeutung und muss je nach den tatsächlichen Bedürfnissen der Unterklasse unterschiedlich implementiert werden, kann diese Methode als abstrakte Methode deklariert werden, und diese Klasse wird zu einer abstrakten Klasse.
Klassen, die abstrakte Methoden enthalten, werden als abstrakte Klassen bezeichnet, aber sie bedeuten nicht, dass abstrakte Methoden nur in abstrakten Klassen gefunden werden können. Wie gewöhnliche Klassen können sie auch Mitgliedsvariablen und normale Mitgliedermethoden haben. Beachten Sie, dass es drei Hauptunterschiede zwischen abstrakten Klassen und gewöhnlichen Klassen gibt:
1) Die abstrakte Methode muss öffentlich oder geschützt sein (denn wenn sie privat ist, kann sie nicht von der Unterklasse geerbt werden und die Unterklasse kann die Methode nicht implementieren). Standardmäßig ist es öffentlich.
2) Abstrakte Klassen können nicht zum Erstellen von Objekten verwendet werden.
3) Wenn eine Klasse eine abstrakte Klasse erbt, muss die Unterklasse die abstrakte Methode der übergeordneten Klasse implementieren. Wenn die Unterklasse die abstrakte Methode der übergeordneten Klasse nicht implementiert, muss die Unterklasse auch als abstrakte Klasse definiert werden.
In anderen Aspekten gibt es keinen Unterschied zwischen abstrakten Klassen und gewöhnlichen Klassen.
2. Schnittstelle
Schnittstelle, die Schnittstelle in englischer Sprache, in Software Engineering genannt, beziehen sich im Allgemeinen auf Methoden oder Funktionen, die andere anrufen können. Daraus können wir die ursprüngliche Absicht von Java -Sprachdesigner verstehen, die eine Abstraktion des Verhaltens darstellt. In Java lautet die Form einer Schnittstelle wie folgt:
[public] interface interfacename {}
Schnittstellen können Variablen und Methoden enthalten. Es ist jedoch zu beachten, dass Variablen in der Schnittstelle implizit als öffentliche statische endgültige Variablen spezifiziert werden (und nur öffentliche statische endgültige Variablen sein können, und die Methoden werden implizit als öffentliche abstrakte Methode angegeben, während die Methoden mit anderen Schlüsselwörtern implizit als öffentliche abstrakte Methode angegeben werden. Implementierungen, dh Methoden in der Schnittstelle müssen abstrakte Methoden sein. Von hier aus können wir den Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse vage erkennen. Eine Schnittstelle ist ein extrem abstrakter Typ. Es ist "abstrakter" als eine abstrakte Klasse und definiert im Allgemeinen keine Variablen in einer Schnittstelle.
Um eine Klasse einer bestimmten Gruppe von Schnittstellen zu befolgen, müssen Sie das Keyword von Geräten verwenden. Das spezifische Format lautet wie folgt:
Klasse className implementiert interface1, interface2, [....] {}
Es ist ersichtlich, dass eine Klasse mehrere spezifische Schnittstellen folgen darf. Wenn eine nicht abstrakte Klasse einer Schnittstelle folgt, müssen alle Methoden in dieser Schnittstelle implementiert werden. Für abstrakte Klassen, die einer Schnittstelle folgen, werden abstrakte Methoden in dieser Schnittstelle möglicherweise nicht implementiert.
3. Der Unterschied zwischen abstrakten Klassen und Schnittstellen
1. Unterschiede auf grammatikalischer Ebene
1) Abstract -Klassen können Implementierungsdetails von Mitgliedermethoden liefern, während nur öffentliche abstrakte Methoden in der Schnittstelle vorhanden sind.
2) Die Mitgliedsvariablen in abstrakten Klassen können von verschiedenen Typen sein, während die Mitgliedsvariablen in der Schnittstelle nur von öffentlichem statischen endgültigen Typ sein können.
3) Die Schnittstelle kann keine statischen Codeblöcke und statischen Methoden enthalten, während abstrakte Klassen statische Codeblöcke und statische Methoden aufweisen können.
4) Eine Klasse kann nur eine abstrakte Klasse erben, während eine Klasse mehrere Schnittstellen implementieren kann.
2. Unterschiede auf Designebene
1) Abstrakte Klassen sind Abstraktionen von Dingen, dh Abstraktionen von Klassen, während Schnittstellen Abstraktionen des Verhaltens sind. Eine abstrakte Klasse fasst die gesamte Klasse ab, einschließlich Eigenschaften und Verhalten, aber eine Schnittstelle abstrahiert den Klassenteil (Verhalten). Um ein einfaches Beispiel zu geben, sind Flugzeuge und Vögel unterschiedliche Dinge, aber alle haben eines gemeinsam, das heißt, sie alle fliegen. Dann kann das Flugzeug beim Entwerfen als Flugzeug und ein vogelartiger Charakter ausgelegt werden, aber das Flugcharakteristik kann nicht als Klasse gestaltet werden. Daher ist es nur ein Verhaltensmerkmal, keine abstrakte Beschreibung einer Art von Dingen. Zu diesem Zeitpunkt kann der Flug als Schnittstellenfliege entworfen werden, einschließlich Methode Fly () sowie dann Flugzeug und Vogel implementieren die Fly -Schnittstelle entsprechend ihren eigenen Bedürfnissen. Dann kann es für verschiedene Arten von Flugzeugen wie Kampfflugzeugen, Zivilflugzeugen usw. das Flugzeug direkt erben. Es ähnelt auch Vögeln. Verschiedene Arten von Vögeln können die Vogelklasse direkt erben. Von hier aus können wir sehen, dass die Vererbung eine "Ja oder nicht" -Beziehung ist, während die Interface -Implementierung eine "Ja oder nicht" -Beziehung ist. Wenn eine Klasse eine abstrakte Klasse erbt, muss die Unterklasse eine Art abstrakter Klasse sein, und die Schnittstellenimplementierung ist eine Beziehung, die nicht existiert, z. B. ob der Vogel fliegen kann (oder ob sie die Eigenschaften des Fliegens hat). Wenn es fliegen kann, kann es diese Schnittstelle realisieren. Wenn es nicht fliegen kann, wird es diese Schnittstelle nicht erkennen.
2) Verschiedene Designstufen, abstrakte Klasse ist ein Vorlagendesign, da die übergeordnete Klasse vieler Unterklassen. Und die Schnittstelle ist ein Verhaltenscode, es ist ein Strahlungsdesign. Was ist Vorlagendesign? Das einfachste Beispiel ist, dass jeder die Vorlagen in PPT verwendet hat. Wenn Sie Vorlage A verwenden, um PPT B und PPT C zu entwerfen, ist der häufige Teil von PPT B und PPT C Vorlage A. Wenn ihr öffentlicher Teil geändert werden muss, müssen Sie nur die Vorlage A ändern, und es müssen nicht die PPT B-Veränderung von PPT B erneut wechseln und PPT C. Strahlungsdesign, wie ein Aufzug mit einer Alarmanlage ausgestattet, müssen nach dem Aktualisieren des Alarms aktualisiert werden. Alle müssen aktualisiert werden. Das heißt, für abstrakte Klassen, wenn Sie neue Methoden hinzufügen müssen, können Sie der abstrakten Klasse direkt spezifische Implementierungen hinzufügen, und Unterklassen können nicht geändert werden. Aber für Schnittstellen ist es nicht möglich. Wenn die Schnittstelle geändert wird, müssen alle Klassen, die diese Schnittstelle implementieren, entsprechend geändert werden.
Sehen wir uns das am weitesten verbreitete Beispiel im Internet an: Beispiele für Türen und Alarme: Türen haben zwei Aktionen: Open () und Close (). Zu diesem Zeitpunkt können wir dieses abstrakte Konzept durch abstrakte Klassen und Schnittstellen definieren:
abstrakte Klassenentür {public abstract void open (); public abstract void close ();}oder:
Schnittstellenentür {public abstract void open (); public abstract void close ();}Aber jetzt, wenn wir die Tür brauchen, um die Funktion von Alarm () zu haben, wie kann ich sie implementieren? Die folgenden zwei Ideen werden bereitgestellt:
1) Stellen Sie alle drei Funktionen in die abstrakte Klasse ein, aber auf diese Weise haben alle Unterklassen, die aus dieser abstrakten Klasse geerbt wurden, Alarmfunktionen, aber einige Türen haben nicht unbedingt Alarmfunktionen.
2) Stellen Sie all diese drei Funktionen in die Schnittstelle ein. Klassen, die Alarmfunktionen verwenden müssen, müssen Open () und Close () in dieser Schnittstelle implementieren. Vielleicht hat diese Klasse nicht die beiden Funktionen von Open () und Close (), wie z. B. Feueralarmen.
Von hier aus können wir sehen, dass die Tür offen (), Close () und Alarm () einfach zu zwei Verhaltensweisen in verschiedenen Kategorien gehören. Open () und Close () gehören zu den inhärenten Verhaltensmerkmalen des Tors selbst, während Alarm () zu erweiterten zusätzlichen Verhaltensweisen gehört. Daher besteht die beste Lösung darin, den Alarm als Schnittstelle einschließlich Alarm () Verhalten und Tür als separate abstrakte Klasse zu entwerfen, einschließlich offener und enger Verhalten. Ein weiteres Alarmtor ist so konzipiert, dass er die Türklasse erben und die Alarmschnittstelle implementiert.
Schnittstelle alram {void alarm ();} abstrakte Klassenentür {void open (); void close ();} Klasse Alarmdoor Extendstür implementiert Alarm {void oepn () {// ..} void close () {// ..} void alarm () {// ...}}Das obige ist eine Zusammenstellung von Java -Schnittstellen und abstrakten Klassen. Ich hoffe, es kann Freunden helfen, die Java -Programmierung lernen.