Java-Schnittstelle (mit Beispielen)

In diesem Tutorial lernen wir Java-Schnittstellen kennen. Anhand von Beispielen lernen wir, wie man Schnittstellen implementiert und wann man sie im Detail verwendet.

Eine Schnittstelle ist eine vollständig abstrakte Klasse, die eine Gruppe von Methoden ohne Body enthält.

In Java definiert eine Schnittstelle eine Reihe von Spezifikationen, die andere Klassen implementieren müssen. Beispielsweise,

 interface Language ( public void getName(); )

Hier haben wir das interfaceSchlüsselwort verwendet, um eine Schnittstelle mit dem Namen Sprache zu erstellen. Die Sprachschnittstelle definiert eine Spezifikation getName().

Jetzt sollte jede Klasse, die diese Schnittstelle verwendet, die getName()Spezifikation implementieren .

Beispiel: Java-Schnittstelle

 // create an interface interface Language ( void getName(String name); ) // class implements interface class ProgrammingLanguage implements Language ( // implementation of abstract method public void getName(String name) ( System.out.println("Programming Language: " + name); ) ) class Main ( public static void main(String() args) ( ProgrammingLanguage language = new ProgrammingLanguage(); language.getName("Java"); ) )

Ausgabe

 Programmiersprache: Java

Im obigen Beispiel haben wir eine Schnittstelle mit dem Namen Sprache erstellt. Die Schnittstelle enthält eine abstrakte Methode getName().

Hier implementiert die ProgrammingLanguage-Klasse die Schnittstelle und stellt die Implementierung für die Methode bereit.

Die Verwendung von abstractSchlüsselwörtern beim Deklarieren abstrakter Methoden innerhalb einer Schnittstelle ist nicht obligatorisch . Dies liegt daran, dass eine Schnittstelle nur abstrakte Methoden enthält, keine regulären Methoden.

Hinweis : Alle Methoden in einer Schnittstelle sind implizit publicund alle Felder implizit public static final. Beispielsweise,

 interface Language ( // by default public static final String type = "programming language"; // by default public void getName(); )

Implementierung einer Schnittstelle

Wie bei abstrakten Klassen können wir keine Objekte einer Schnittstelle erstellen. Wir können jedoch eine Schnittstelle implementieren.

Wir verwenden das implementsSchlüsselwort, um eine Schnittstelle zu implementieren. Beispielsweise,

 // create an interface interface Polygon ( void getArea(int length, int breadth); ) // implement the Polygon interface class Rectangle implements Polygon ( // implementation of abstract method public void getArea(int length, int breadth) ( System.out.println("The area of the rectangle is " + (length * breadth)); ) ) class Main ( public static void main(String() args) ( // create an object Rectangle r1 = new Rectangle(); r1.getArea(5, 6); ) )

Ausgabe

 Die Fläche des Rechtecks ​​beträgt 30

Im obigen Beispiel haben wir eine Schnittstelle mit dem Namen Polygon erstellt. Die Schnittstelle enthält eine abstrakte Methode getArea().

Hier implementiert die Rectangle-Klasse Polygon. Und bietet die Implementierung der getArea()Methode.

Hinweis : Eine Klasse kann mehrere Schnittstellen implementieren. Beispielsweise,

 interface A ( // members of A ) interface B ( // members of B ) class C implements A, B ( // abstract members of A // abstract members of B )

Eine Schnittstelle erweitern

Ähnlich wie Klassen können Schnittstellen andere Schnittstellen erweitern. Das extendsSchlüsselwort wird zum Erweitern von Schnittstellen verwendet. Beispielsweise,

 interface Line ( // members of Line interface ) // extending interface interface Polygon extends Line ( // members of Polygon interface // members of Line interface )

Hier erweitert die Polygon-Schnittstelle die Linienschnittstelle. Wenn eine Klasse Polygon implementiert, sollte sie Implementierungen für alle abstrakten Methoden von Line und Polygon bereitstellen.

Hinweis : Eine Schnittstelle kann mehrere Schnittstellen erweitern. Beispielsweise,

 interface A (… ) interface B (… ) interface C extends A, B (… )

Vorteile der Schnittstelle in Java

Nachdem wir nun wissen, was Schnittstellen sind, lernen wir, warum Schnittstellen in Java verwendet werden.

  • Schnittstellen bieten Spezifikationen , denen eine Klasse (die sie implementiert) folgen muss.
    In unserem vorherigen Beispiel haben wir getArea()als Spezifikation innerhalb der Schnittstelle Polygon verwendet. Dies ist wie das Festlegen einer Regel, nach der wir die Fläche jedes Polygons ermitteln können sollten.
    Jetzt muss jede Klasse, die die Polygon-Schnittstelle implementiert, eine Implementierung für die getArea()Methode bereitstellen .
  • Ähnlich wie bei abstrakten Klassen helfen uns Schnittstellen, eine Abstraktion in Java zu erreichen .
    Hier wissen wir, dass getArea()die Fläche von Polygonen berechnet wird, aber die Art und Weise, wie die Fläche berechnet wird, ist für verschiedene Polygone unterschiedlich. Daher ist die Implementierung von getArea()unabhängig voneinander.
  • Schnittstellen werden auch verwendet, um eine Mehrfachvererbung in Java zu erreichen. Beispielsweise,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Hier implementiert die Klasse Rectangle zwei verschiedene Schnittstellen. Auf diese Weise erreichen wir eine Mehrfachvererbung in Java.

Standardmethoden in Java-Schnittstellen

Mit der Veröffentlichung von Java 8 können wir jetzt Methoden mit Implementierung innerhalb einer Schnittstelle hinzufügen. Diese Methoden werden als Standardmethoden bezeichnet.

Um Standardmethoden innerhalb von Schnittstellen zu deklarieren, verwenden wir das defaultSchlüsselwort. Beispielsweise,

 public default void getSides() ( // body of getSides() )

Warum Standardmethoden?

Let's take a scenario to understand why default methods are introduced in Java.

Suppose, we need to add a new method in an interface.

We can add the method in our interface easily without implementation. However, that's not the end of the story. All our classes that implement that interface must provide an implementation for the method.

If a large number of classes were implementing this interface, we need to track all these classes and make changes in them. This is not only tedious but error-prone as well.

To resolve this, Java introduced default methods. Default methods are inherited like ordinary methods.

Let's take an example to have a better understanding of default methods.

Example: Default Method in Java Interface

 interface Polygon ( void getArea(); // default method default void getSides() ( System.out.println("I can get sides of a polygon."); ) ) // implements the interface class Rectangle implements Polygon ( public void getArea() ( int length = 6; int breadth = 5; int area = length * breadth; System.out.println("The area of the rectangle is " + area); ) // overrides the getSides() public void getSides() ( System.out.println("I have 4 sides."); ) ) // implements the interface class Square implements Polygon ( public void getArea() ( int length = 5; int area = length * length; System.out.println("The area of the square is " + area); ) ) class Main ( public static void main(String() args) ( // create an object of Rectangle Rectangle r1 = new Rectangle(); r1.getArea(); r1.getSides(); // create an object of Square Square s1 = new Square(); s1.getArea(); s1.getSides(); ) )

Output

 The area of the rectangle is 30 I have 4 sides. The area of the square is 25 I can get sides of a polygon.

In the above example, we have created an interface named Polygon. It has a default method getSides() and an abstract method getArea().

Here, we have created two classes Rectangle and Square that implement Polygon.

The Rectangle class provides the implementation of the getArea() method and overrides the getSides() method. However, the Square class only provides the implementation of the getArea() method.

Now, while calling the getSides() method using the Rectangle object, the overridden method is called. However, in the case of the Square object, the default method is called.

private and static Methods in Interface

The Java 8 also added another feature to include static methods inside an interface.

Similar to a class, we can access static methods of an interface using its references. For example,

 // create an interface interface Polygon ( staticMethod()(… ) ) // access static method Polygon.staticMethod();

Note: With the release of Java 9, private methods are also supported in interfaces.

We cannot create objects of an interface. Hence, private methods are used as helper methods that provide support to other methods in interfaces.

Practical Example of Interface

Let's see a more practical example of Java Interface.

 // To use the sqrt function import java.lang.Math; interface Polygon ( void getArea(); // calculate the perimeter of a Polygon default void getPerimeter(int… sides) ( int perimeter = 0; for (int side: sides) ( perimeter += side; ) System.out.println("Perimeter: " + perimeter); ) ) class Triangle implements Polygon ( private int a, b, c; private double s, area; // initializing sides of a triangle Triangle(int a, int b, int c) ( this.a = a; this.b = b; this.c = c; s = 0; ) // calculate the area of a triangle public void getArea() ( s = (double) (a + b + c)/2; area = Math.sqrt(s*(s-a)*(s-b)*(s-c)); System.out.println("Area: " + area); ) ) class Main ( public static void main(String() args) ( Triangle t1 = new Triangle(2, 3, 4); // calls the method of the Triangle class t1.getArea(); // calls the method of Polygon t1.getPerimeter(2, 3, 4); ) )

Output

 Area: 2.9047375096555625 Perimeter: 9

In the above program, we have created an interface named Polygon. It includes a default method getPerimeter() and an abstract method getArea().

We can calculate the perimeter of all polygons in the same manner so we implemented the body of getPerimeter() in Polygon.

Now, all polygons that implement Polygon can use getPerimeter() to calculate perimeter.

Die Regel zur Berechnung der Fläche ist jedoch für verschiedene Polygone unterschiedlich. Daher getArea()ist ohne Implementierung enthalten.

Jede Klasse, die Polygon implementiert, muss eine Implementierung von bereitstellen getArea().

Interessante Beiträge...