Interfejs Java (z przykładami)

W tym samouczku dowiemy się o interfejsach Java. Dowiemy się, jak szczegółowo implementować interfejsy i kiedy z nich korzystać na przykładach.

Interfejs to w pełni abstrakcyjna klasa, która zawiera grupę metod bez treści.

W Javie interfejs definiuje zestaw specyfikacji, które muszą implementować inne klasy. Na przykład,

 interface Language ( public void getName(); )

Tutaj użyliśmy interfacesłowa kluczowego, aby utworzyć interfejs o nazwie Język. Interfejs języka definiuje specyfikację getName().

Teraz każda klasa korzystająca z tego interfejsu powinna implementować getName()specyfikację.

Przykład: interfejs 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"); ) )

Wynik

 Język programowania: Java

W powyższym przykładzie stworzyliśmy interfejs o nazwie Language. Interfejs zawiera metodę abstrakcyjną getName().

Tutaj klasa ProgrammingLanguage implementuje interfejs i zapewnia implementację metody.

Nie jest obowiązkowe używanie abstractsłowa kluczowego podczas deklarowania abstrakcyjnych metod wewnątrz interfejsu. Dzieje się tak, ponieważ interfejs zawiera tylko metody abstrakcyjne, a nie zwykłe metody.

Uwaga : wszystkie metody wewnątrz interfejsu są niejawne, publica wszystkie pola są niejawne public static final. Na przykład,

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

Implementowanie interfejsu

Podobnie jak klasy abstrakcyjne, nie możemy tworzyć obiektów interfejsu. Możemy jednak zaimplementować interfejs.

Używamy implementssłowa kluczowego do implementacji interfejsu. Na przykład,

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

Wynik

 Pole prostokąta to 30

W powyższym przykładzie stworzyliśmy interfejs o nazwie Polygon. Interfejs zawiera metodę abstrakcyjną getArea().

Tutaj klasa Rectangle implementuje Polygon. I zapewnia implementację getArea()metody.

Uwaga : Klasa może implementować wiele interfejsów. Na przykład,

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

Rozszerzanie interfejsu

Podobnie jak klasy, interfejsy mogą rozszerzać inne interfejsy. Słowo extendskluczowe służy do rozszerzania interfejsów. Na przykład,

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

W tym przypadku interfejs Polygon rozszerza interfejs Line. Teraz, jeśli jakakolwiek klasa implementuje Polygon, powinna zapewnić implementacje dla wszystkich metod abstrakcyjnych zarówno Line, jak i Polygon.

Uwaga : Interfejs może rozszerzyć wiele interfejsów. Na przykład,

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

Zalety interfejsu w Javie

Teraz, gdy wiemy, czym są interfejsy, dowiedzmy się, dlaczego są one używane w Javie.

  • Interfejsy zapewniają specyfikacje , które musi spełniać klasa (która ją implementuje).
    W naszym poprzednim przykładzie użyliśmy getArea()jako specyfikacji wewnątrz interfejsu Polygon. To jest jak ustalenie reguły, że powinniśmy być w stanie uzyskać pole każdego wielokąta.
    Teraz każda klasa, która implementuje interfejs Polygon, musi zapewniać implementację getArea()metody.
  • Podobnie jak klasy abstrakcyjne, interfejsy pomagają nam osiągnąć abstrakcję w Javie .
    Tutaj wiemy, że getArea()oblicza pole powierzchni wielokątów, ale sposób obliczania powierzchni jest inny dla różnych wielokątów. W związku z tym realizacja getArea()jest od siebie niezależna.
  • Interfejsy są również używane do osiągnięcia wielokrotnego dziedziczenia w Javie. Na przykład,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Tutaj klasa Rectangle implementuje dwa różne interfejsy. W ten sposób uzyskujemy wielokrotne dziedziczenie w Javie.

domyślne metody w interfejsach Java

Wraz z wydaniem języka Java 8 możemy teraz dodawać metody z implementacją wewnątrz interfejsu. Te metody nazywane są metodami domyślnymi.

Aby zadeklarować domyślne metody wewnątrz interfejsów, używamy defaultsłowa kluczowego. Na przykład,

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

Dlaczego metody domyślne?

Przyjrzyjmy się scenariuszowi, aby zrozumieć, dlaczego w Javie wprowadzono metody domyślne.

Załóżmy, że musimy dodać nową metodę w interfejsie.

Możemy łatwo dodać metodę do naszego interfejsu bez implementacji. Jednak to nie koniec historii. Wszystkie nasze klasy, które implementują ten interfejs, muszą zapewniać implementację metody.

Jeśli wiele klas implementowało ten interfejs, musimy śledzić wszystkie te klasy i wprowadzać w nich zmiany. Jest to nie tylko żmudne, ale także podatne na błędy.

Aby rozwiązać ten problem, Java wprowadziła metody domyślne. Metody domyślne są dziedziczone jak zwykłe metody.

Weźmy przykład, aby lepiej zrozumieć metody domyślne.

Przykład: domyślna metoda w interfejsie Java

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

Wynik

Pole prostokąta to 30 Mam 4 boki. Pole kwadratu to 25. Mogę uzyskać boki wielokąta.

W powyższym przykładzie stworzyliśmy interfejs o nazwie Polygon. Ma metodę domyślną getSides()i metodę abstrakcyjną getArea().

Tutaj stworzyliśmy dwie klasy Rectangle i Square, które implementują Polygon.

Klasa Rectangle zapewnia implementację getArea()metody i przesłania getSides()metodę. Jednak klasa Square zapewnia tylko implementację getArea()metody.

Teraz podczas wywoływania getSides()metody przy użyciu obiektu Rectangle wywoływana jest metoda przesłonięta. Jednak w przypadku obiektu Square wywoływana jest metoda domyślna.

metody prywatne i statyczne w interfejsie

Java 8 dodała także kolejną funkcję, która zawiera statyczne metody wewnątrz interfejsu.

Podobnie jak w przypadku klasy, możemy uzyskać dostęp do statycznych metod interfejsu za pomocą jego referencji. Na przykład,

 // 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.

Jednak zasada obliczania powierzchni jest inna dla różnych wielokątów. W związku z tym getArea()jest uwzględniony bez implementacji.

Każda klasa, która implementuje Polygon, musi zapewniać implementację getArea().

Interesujące artykuły...