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

В горния пример създадохме интерфейс на име Полигон. Интерфейсът съдържа абстрактен метод getArea().

Тук класът Rectangle изпълнява Polygon. И, осигурява изпълнението на 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 разширява линейния интерфейс. Сега, ако някой клас реализира Polygon, той трябва да осигури реализации за всички абстрактни методи както на Line, така и на Polygon.

Забележка : Интерфейсът може да разшири множество интерфейси. Например,

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

Предимства на интерфейса в Java

Сега, след като знаем какво представляват интерфейсите, нека научим защо интерфейсите се използват в Java.

  • Интерфейсите предоставят спецификации, които клас (който го прилага) трябва да следва.
    В предишния ни пример използвахме getArea()като спецификация вътре в интерфейса Полигон. Това е като да зададете правило, че трябва да можем да получим площта на всеки многоъгълник.
    Сега всеки клас, който реализира интерфейса Polygon, трябва да осигури изпълнение за getArea()метода.
  • Подобно на абстрактните класове, интерфейсите ни помагат да постигнем абстракция в Java .
    Тук знаем, че getArea()изчислява площта на полигоните, но начинът на изчисляване на площта е различен за различните полигони. Следователно изпълнението на getArea()е независимо едно от друго.
  • Интерфейсите също се използват за постигане на множествено наследяване в Java. Например,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Тук класът Rectangle изпълнява два различни интерфейса. По този начин постигаме множествено наследяване в Java.

методи по подразбиране в Java Interfaces

С пускането на Java 8 вече можем да добавяме методи с внедряване вътре в интерфейс. Тези методи се наричат ​​методи по подразбиране.

За да декларираме методи по подразбиране в интерфейсите, използваме defaultключовата дума. Например,

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

Защо методи по подразбиране?

Нека вземем сценарий, за да разберем защо методите по подразбиране са въведени в Java.

Да предположим, че трябва да добавим нов метод в интерфейс.

Можем да добавим метода в нашия интерфейс лесно без изпълнение. Това обаче не е краят на историята. Всички наши класове, които реализират този интерфейс, трябва да осигурят изпълнение за метода.

Ако голям брой класове внедряват този интерфейс, трябва да проследим всички тези класове и да направим промени в тях. Това е не само досадно, но и склонно към грешки.

За да разреши това, Java въведе методи по подразбиране. Методите по подразбиране се наследяват като обикновените методи.

Да вземем пример, за да разберем по-добре методите по подразбиране.

Пример: Метод по подразбиране в 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(); ) )

Изход

Площта на правоъгълника е 30 Имам 4 страни. Площта на квадрата е 25 Мога да получа страни на многоъгълник.

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

Интересни статии...