Διεπαφή Java (με παραδείγματα)

Σε αυτό το σεμινάριο, θα μάθουμε για τις διεπαφές Java. Θα μάθουμε πώς να εφαρμόζουμε διεπαφές και πότε να τις χρησιμοποιούμε λεπτομερώς με τη βοήθεια παραδειγμάτων.

Μια διεπαφή είναι μια πλήρως αφηρημένη τάξη που περιλαμβάνει μια ομάδα μεθόδων χωρίς σώμα.

Στην Java, μια διεπαφή καθορίζει ένα σύνολο προδιαγραφών που πρέπει να εφαρμόσουν άλλες κλάσεις. Για παράδειγμα,

 interface Language ( public void getName(); )

Εδώ, χρησιμοποιήσαμε τη interfaceλέξη-κλειδί για να δημιουργήσουμε μια διεπαφή που ονομάζεται Language. Η διεπαφή γλώσσας καθορίζει μια προδιαγραφή getName().

Τώρα, κάθε τάξη που χρησιμοποιεί αυτήν τη διεπαφή πρέπει να εφαρμόσει τις getName()προδιαγραφές.

Παράδειγμα: Διεπαφή Java

 // 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"); ) )

Παραγωγή

 Γλώσσα προγραμματισμού: Java

Στο παραπάνω παράδειγμα, δημιουργήσαμε μια διεπαφή με την ονομασία Language. Η διεπαφή περιλαμβάνει μια αφηρημένη μέθοδο getName().

Εδώ, η κλάση ProgrammingLanguage εφαρμόζει τη διεπαφή και παρέχει την εφαρμογή για τη μέθοδο.

Δεν είναι υποχρεωτική η χρήση abstractλέξεων-κλειδιών κατά τη δήλωση αφηρημένων μεθόδων μέσα σε μια διεπαφή. Επειδή μια διεπαφή περιλαμβάνει μόνο αφηρημένες μεθόδους και όχι κανονικές μεθόδους.

Σημείωση : Όλες οι μέθοδοι μέσα σε μια διεπαφή είναι σιωπηρά publicκαι όλα τα πεδία είναι σιωπηρά public static final. Για παράδειγμα,

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

Εφαρμογή διασύνδεσης

Όπως οι αφηρημένες τάξεις, δεν μπορούμε να δημιουργήσουμε αντικείμενα μιας διεπαφής. Ωστόσο, μπορούμε να εφαρμόσουμε μια διεπαφή.

Χρησιμοποιούμε τη implementsλέξη-κλειδί για να εφαρμόσουμε μια διεπαφή. Για παράδειγμα,

 // 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); ) )

Παραγωγή

 Η περιοχή του ορθογωνίου είναι 30

Στο παραπάνω παράδειγμα, δημιουργήσαμε μια διεπαφή με το όνομα Polygon. Η διεπαφή περιέχει μια αφηρημένη μέθοδο getArea().

Εδώ, η κατηγορία ορθογωνίου εφαρμόζει το πολύγωνο. Και, παρέχει την εφαρμογή της getArea()μεθόδου.

Σημείωση : Μια κλάση μπορεί να εφαρμόσει πολλαπλές διεπαφές. Για παράδειγμα,

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

Επέκταση διεπαφής

Παρόμοια με τις κλάσεις, οι διεπαφές μπορούν να επεκτείνουν άλλες διεπαφές. Η extendsλέξη-κλειδί χρησιμοποιείται για την επέκταση διεπαφών. Για παράδειγμα,

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

Εδώ, η διασύνδεση Polygon επεκτείνει τη διασύνδεση Line. Τώρα, εάν κάποια κλάση εφαρμόζει το Polygon, θα πρέπει να παρέχει υλοποιήσεις για όλες τις αφηρημένες μεθόδους τόσο της γραμμής όσο και του πολυγώνου.

Σημείωση : Μια διεπαφή μπορεί να επεκτείνει πολλαπλές διεπαφές. Για παράδειγμα,

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

Πλεονεκτήματα της διασύνδεσης στην Java

Τώρα που γνωρίζουμε τι είναι οι διεπαφές, ας μάθουμε γιατί χρησιμοποιούνται οι διεπαφές στην Java.

  • Οι διεπαφές παρέχουν προδιαγραφές που πρέπει να ακολουθήσει μια κλάση (η οποία την εφαρμόζει).
    Στο προηγούμενο παράδειγμά μας, χρησιμοποιήσαμε getArea()ως προδιαγραφή μέσα στο περιβάλλον Polygon. Είναι σαν να θέτουμε έναν κανόνα ότι, πρέπει να είμαστε σε θέση να πάρουμε την περιοχή κάθε πολυγώνου.
    Τώρα κάθε κλάση που εφαρμόζει τη διεπαφή Polygon πρέπει να παρέχει μια εφαρμογή για τη getArea()μέθοδο.
  • Παρόμοια με τις αφηρημένες τάξεις, οι διεπαφές μας βοηθούν να επιτύχουμε αφαίρεση στην Java .
    Εδώ, γνωρίζουμε ότι getArea()υπολογίζει την περιοχή των πολυγώνων, αλλά ο τρόπος υπολογισμού της περιοχής είναι διαφορετικός για διαφορετικά πολύγωνα. Ως εκ τούτου, η εφαρμογή getArea()είναι ανεξάρτητη η μία από την άλλη.
  • Οι διεπαφές χρησιμοποιούνται επίσης για την επίτευξη πολλαπλής κληρονομιάς στην Java. Για παράδειγμα,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Εδώ, η κατηγορία Rectangle εφαρμόζει δύο διαφορετικές διεπαφές. Έτσι επιτυγχάνουμε πολλαπλή κληρονομιά στην Java.

προεπιλεγμένες μέθοδοι στις διεπαφές Java

Με την κυκλοφορία του Java 8, μπορούμε τώρα να προσθέσουμε μεθόδους με εφαρμογή μέσα σε μια διεπαφή. Αυτές οι μέθοδοι ονομάζονται προεπιλεγμένες μέθοδοι.

Για να δηλώσουμε προεπιλεγμένες μεθόδους μέσα σε διεπαφές, χρησιμοποιούμε τη defaultλέξη-κλειδί. Για παράδειγμα,

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

Γιατί οι προεπιλεγμένες μέθοδοι;

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.

Ωστόσο, ο κανόνας για τον υπολογισμό της περιοχής είναι διαφορετικός για διαφορετικά πολύγωνα. Ως εκ τούτου, getArea()περιλαμβάνεται χωρίς εφαρμογή.

Κάθε κλάση που εφαρμόζει το Polygon πρέπει να παρέχει μια εφαρμογή του getArea().

ενδιαφέροντα άρθρα...