Die Essenz einer Schnittstelle: Eine Schnittstelle ist eine spezielle abstrakte Klasse, die nur die Definition von Konstanten und Methoden enthält, nicht jedoch die Implementierung von Variablen und Methoden.
Schnittstellen können einige Dinge haben, die abstrakte Klassen haben. Wenn alle Methoden in einer abstrakten Klasse abstrakt sind, muss keine Methode von dieser abstrakten Klasse implementiert werden, und alle Variablen in dieser abstrakten Klasse sind alle Variablen, die dies nicht können In diesem Fall kann eine solche abstrakte Klasse als Schnittstelle definiert werden. Das Format zum Definieren einer Klasse als Schnittstelle besteht darin, das Schlüsselwort class, das die Klasse deklariert, durch das Schlüsselwort interface zu ersetzen, das die Schnittstelle deklariert.
Eine Schnittstelle ist eine spezielle abstrakte Klasse. In dieser abstrakten Klasse sind alle Methoden abstrakte Methoden, und die Attribute (dh Mitgliedsvariablen) dieser abstrakten Klasse werden als „öffentliche statische endgültige Typattributnamen“ deklariert. Auf diese Weise lautet die Standarddeklaration „öffentliches statisches Finale“, das heißt, die darin enthaltenen Mitgliedsvariablen sind öffentlich, statisch und können nicht geändert werden. Daher kann beim Deklarieren einer Konstante in einer Schnittstelle diese in der Form „öffentlicher statischer endgültiger Typkonstantenname = Wert (Wert)“ oder direkt in der Form „Typkonstantenname = Wert (Wert)“ geschrieben werden )“ wie: „public static final int id = 10“ kann direkt in die Form „int id = 10“ geschrieben werden, da die Standardeigenschaftsdeklarationen in der Schnittstelle alle „public static final“ sind, also „public static final“. " kann weggelassen werden. Die in der Schnittstelle deklarierte abstrakte Methode muss nicht mit dem Schlüsselwort abstract gekennzeichnet werden, da alle Methoden in der Schnittstelle abstrakt sind. Daher wird das Schlüsselwort „abstract“ standardmäßig weggelassen, wenn Sie beispielsweise solche drei Wörter in einer Schnittstelle deklarieren , Methoden: „public void start()“, „public void run()“, „public void „stop()“ wird nicht durch das abstrakte Schlüsselwort vor diesen drei Methoden identifiziert, es handelt sich jedoch um abstrakte Methoden, da die in der Schnittstelle deklarierten Methoden alle abstrakte Methoden sind, sodass das abstrakte Schlüsselwort in den abstrakten Methoden in weggelassen wird Schnittstelle gelöscht, da die standardmäßig deklarierten Methoden abstrakt sind Daher ist es nicht erforderlich, das Wort „abstract“ zu schreiben. Dies unterscheidet sich von der Deklaration abstrakter Methoden in abstrakten Klassen. Bei der Deklaration abstrakter Methoden in abstrakten Klassen müssen Sie das Schlüsselwort „abstract“ verwenden. In Schnittstellen können Sie „abstract“ weglassen. abstract" bei der Deklaration abstrakter Methoden. Hinweis: Die in der Schnittstelle deklarierte abstrakte Methode ist standardmäßig „öffentlich“ und kann nur „öffentlich“ sein. Der Grund, warum sie auf diese Weise deklariert wird, besteht darin, Probleme zu beheben, die bei Mehrfachvererbung in C++ auftreten In C ++ besteht das Problem darin, dass es ziemlich mühsam ist, auf sie zu verweisen, wenn mehrere übergeordnete Klassen mit Mehrfachvererbung ausgeführt werden. Um dieses Problem zu beheben, hat JAVA alle Mitgliedsvariablen in der Schnittstelle in „statisch final“ geändert. Wenn die Mitgliedsvariable vom Typ statisch ist, gehört die Mitgliedsvariable zur gesamten Klasse und ist nicht exklusiv für ein bestimmtes Objekt. Bei der Mehrfachvererbung enthält ein Unterklassenobjekt tatsächlich mehrere übergeordnete Klassenobjekte, während es bei der Einzelvererbung nur ein übergeordnetes Klassenobjekt im Unterklassenobjekt gibt. Mehrfach geerbte Unterklassenobjekte verfügen über mehrere übergeordnete Klassenobjekte, und es können doppelte Mitgliedsvariablen zwischen diesen übergeordneten Klassenobjekten vorhanden sein, was sehr problematisch ist. Daher kann dieses Problem in JAVA durch die Verwendung von Schnittstellen zur Implementierung der Mehrfachvererbung vermieden werden. Als Schnittstelle kann eine Klasse von der Schnittstelle erben (oder die Schnittstelle implementieren). Die Mitgliedsvariablen in der Schnittstelle gelten nicht ausschließlich für ein bestimmtes Objekt. Sie sind alle statische Mitgliedsvariablen und gehören zur gesamten Klasse Daher spielt es keine Rolle, ob eine Klasse mehrere Schnittstellen implementiert, und es kommt zu keinem Konflikt zwischen Objekten. Durch die Implementierung mehrerer Schnittstellen wird auch eine Mehrfachvererbung erreicht und die mit der Mehrfachvererbung verbundenen Probleme vermieden. Dies ist der Vorteil der Verwendung von Schnittstellen zur Implementierung der Mehrfachvererbung.
1. Definieren Sie die Schnittstelle
Verwenden Sie interface, um eine Schnittstelle zu definieren. Schnittstellendefinitionen ähneln ähnlichen Definitionen. Sie sind auch in Schnittstellendeklarationen und Schnittstellenkörper unterteilt. Der Schnittstellenkörper besteht aus zwei Teilen: Konstantendefinition und Methodendefinition. Das Grundformat zum Definieren einer Schnittstelle ist wie folgt:
[Modifikator] Schnittstelle Schnittstellenname [erweitert die Namensliste der übergeordneten Schnittstelle]{
[öffentlich] [statisch] [final] Konstante;
[öffentliche] [abstrakte] Methode;
}
Modifikator: Optional, wird zur Angabe der Zugriffsberechtigung der Schnittstelle verwendet. Der optionale Wert ist öffentlich. Wenn es weggelassen wird, werden die Standardzugriffsberechtigungen verwendet.
Schnittstellenname: Ein erforderlicher Parameter, der zur Angabe des Namens der Schnittstelle verwendet wird. Der Schnittstellenname muss eine gültige Java-Kennung sein. Im Allgemeinen sind Großbuchstaben erforderlich.
erweitert: Namensliste der übergeordneten Schnittstelle: optionaler Parameter, mit dem angegeben wird, von welcher übergeordneten Schnittstelle die zu definierende Schnittstelle erbt. Bei Verwendung des Schlüsselworts „extends“ ist der Name der übergeordneten Schnittstelle ein erforderlicher Parameter.
Methoden: Die Methoden in der Schnittstelle werden nur definiert, aber nicht implementiert.
Definieren Sie beispielsweise eine Schnittstelle für die Berechnung, in der ein konstanter PI und zwei Methoden definiert sind. Der spezifische Code lautet wie folgt:
öffentliche Schnittstelle CalInterface { final float PI=3.14159f;//Definieren Sie die Konstante PI, die zur Darstellung von pi verwendet wird float getArea(float r);//Definieren Sie eine Methode zur Flächenberechnung getArea() float getCircumference(float r);// Definieren Sie a Methode zur Berechnung des Umfangs getCircumference() }
Beachten:
Wie bei den Klassendateien von Java muss der Dateiname der Schnittstellendatei mit dem Schnittstellennamen identisch sein.
2. Implementieren Sie die Schnittstelle
Nachdem eine Schnittstelle definiert ist, kann sie in einer Klasse implementiert werden. Um eine Schnittstelle in einer Klasse zu implementieren, können Sie das Schlüsselwort „implements“ verwenden. Das Grundformat lautet wie folgt:
[Modifikator] Klasse <Klassenname> [erweitert den Namen der übergeordneten Klasse] [implementiert Schnittstellenliste]{
............
}
Modifikator: Optionaler Parameter, der zur Angabe der Zugriffsberechtigung der Klasse verwendet wird. Die optionalen Werte sind öffentlich, abstrakt und endgültig.
Klassenname: Ein erforderlicher Parameter, der zur Angabe des Klassennamens verwendet wird. Der Klassenname muss ein zulässiger Java-Bezeichner sein. Im Allgemeinen sind Großbuchstaben erforderlich.
erweitert den Namen der übergeordneten Klasse: optionaler Parameter, der verwendet wird, um anzugeben, von welcher übergeordneten Klasse die zu definierende Klasse erbt. Bei Verwendung des Schlüsselworts „extends“ ist der Name der übergeordneten Klasse ein erforderlicher Parameter.
implementiert Schnittstellenliste: Optionaler Parameter, der verwendet wird, um anzugeben, welche Schnittstellen diese Klasse implementiert. Bei Verwendung des Schlüsselworts „implements“ ist die Schnittstellenliste ein erforderlicher Parameter. Wenn die Schnittstellenliste mehrere Schnittstellennamen enthält, trennen Sie diese durch Kommas.
Bei der Implementierung einer Schnittstelle in einer Klasse müssen Methodenname, Rückgabewerttyp, Anzahl und Typ der Parameter genau mit denen in der Schnittstelle übereinstimmen und alle Methoden in der Schnittstelle müssen implementiert sein. Schreiben Sie beispielsweise eine Klasse namens Cire, die die in Abschnitt 5.7.1 definierte Schnittstelle Calculate implementiert. Der spezifische Code lautet wie folgt:
Die öffentliche Klasse Cire implementiert CalInterface { public float getArea(float r) { float area=PI*r*r;//Berechnen Sie die Kreisfläche und weisen Sie sie der variablen Fläche zu. return area;//Gibt die berechnete Kreisfläche zurück} public float getCircumference (float r) { float umfang=2*PI*r; // Berechne den Umfang des Kreises und weise ihn der Variablen umfang zu. return umfang // Gibt den berechneten Umfang zurück} public static void main(String[] args) { Cire c = new Cire(); float f = c.getArea(2.0f);
Bei der Vererbung von Klassen kann nur eine einzelne Vererbung durchgeführt werden. Bei der Implementierung von Schnittstellen können jedoch mehrere Schnittstellen gleichzeitig implementiert werden, und jede Schnittstelle wird durch ein Komma "," getrennt.
Zu diesem Zeitpunkt können Konstanten- oder Methodennamenkonflikte (in mehreren Schnittstellen) auftreten. Wenn die Konstanten in Konflikt stehen, müssen Sie die Schnittstelle der Konstante explizit angeben. Dies kann durch „Schnittstellenname.Konstante“ erreicht werden. Wenn ein Methodenkonflikt auftritt, müssen Sie nur eine Methode implementieren.