Јава интерфејс (са примерима)

У овом упутству ћемо научити о Јава интерфејсима. Научићемо како да имплементирамо интерфејсе и када их детаљно користимо уз помоћ примера.

Интерфејс је потпуно апстрактна класа која укључује групу метода без тела.

У Јави интерфејс дефинише скуп спецификација које друге класе морају применити. На пример,

 interface Language ( public void getName(); )

Овде смо користили interfaceкључну реч за стварање интерфејса под називом Језик. Језички интерфејс дефинише спецификацију getName().

Сада би свака класа која користи овај интерфејс требало да примени getName()спецификацију.

Пример: Јава интерфејс

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

Оутпут

 Програмски језик: Јава

У горњем примеру створили смо интерфејс под називом Језик. Интерфејс укључује апстрактну методу getName().

Овде класа ПрограммингЛангуаге имплементира интерфејс и обезбеђује имплементацију методе.

Није обавезно користити 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().

Овде класа Рецтангле примењује Полигон. И, обезбеђује примену 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 )

Овде полигонски интерфејс проширује линијски интерфејс. Сада, ако било која класа имплементира Полигон, требало би да обезбеди имплементације за све апстрактне методе Лине-а и Полигона.

Напомена : Интерфејс може проширити више интерфејса. На пример,

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

Предности интерфејса у Јави

Сад кад знамо шта су интерфејси, научимо зашто се интерфејси користе у Јави.

  • Интерфејси пружају спецификације које класа (која је примењује) мора следити.
    У нашем претходном примеру користили смо getArea()као спецификацију унутар интерфејса Полигон. Ово је попут постављања правила да бисмо требали моћи добити површину сваког полигона.
    Сада било која класа која имплементира Полигон интерфејс мора да обезбеди имплементацију getArea()методе.
  • Слично апстрактним класама, интерфејси нам помажу да постигнемо апстракцију у Јави .
    Овде знамо да getArea()израчунава површину полигона, али начин израчунавања површине различит је за различите полигоне. Стога је примена getArea()независна једна од друге.
  • Интерфејси се такође користе за постизање вишеструког наслеђивања у Јави. На пример,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Овде класа Рецтангле примењује два различита интерфејса. Тако постижемо вишеструко наслеђивање у Јави.

подразумеване методе у Јава интерфејсима

Издањем Јаве 8, сада можемо да додамо методе са имплементацијом унутар интерфејса. Те методе се називају подразумеваним методама.

Да бисмо декларисали задате методе унутар интерфејса, користимо defaultкључну реч. На пример,

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

Зашто задате методе?

Узмимо сценарио да схватимо зашто су задате методе уведене у Јави.

Претпоставимо да морамо да додамо нову методу у интерфејс.

Методу у наш интерфејс можемо лако додати без имплементације. Међутим, ту није крај приче. Све наше класе које примењују тај интерфејс морају да обезбеде примену методе.

Ако је велики број класа примењивао овај интерфејс, морамо да пратимо све ове класе и уносимо промене у њих. Ово није само заморно већ и склоно грешкама.

Да би то решила, Јава је увела подразумеване методе. Подразумеване методе се наслеђују као и уобичајене методе.

Узмимо пример да бисмо боље разумели подразумеване методе.

Пример: Подразумевани метод у Јава интерфејсу

 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()је укључен без примене.

Свака класа која примењује Полигон мора да обезбеди примену getArea().

Занимљиви Чланци...