Java sučelje (s primjerima)

U ovom uputstvu naučit ćemo o Java sučeljima. Uz primjere ćemo naučiti kako implementirati sučelja i kada ih detaljno koristiti.

Sučelje je potpuno apstraktna klasa koja uključuje skup metoda bez tijela.

U Javi sučelje definira skup specifikacija koje druge klase moraju implementirati. Na primjer,

 interface Language ( public void getName(); )

Ovdje smo koristili interfaceključnu riječ za stvaranje sučelja pod nazivom Jezik. Sučelje jezika definira specifikaciju getName().

Sada bi svaka klasa koja koristi ovo sučelje trebala implementirati getName()specifikaciju.

Primjer: Java sučelje

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

Izlaz

 Programski jezik: Java

U gornjem primjeru stvorili smo sučelje nazvano Jezik. Sučelje uključuje apstraktnu metodu getName().

Ovdje klasa ProgrammingLanguage implementira sučelje i pruža implementaciju metode.

Nije obavezno koristiti abstractključnu riječ tijekom deklariranja apstraktnih metoda unutar sučelja. To zato što sučelje uključuje samo apstraktne metode, a ne uobičajene metode.

Napomena : Sve metode unutar sučelja su implicitno publici sva su polja implicitno public static final. Na primjer,

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

Implementacija sučelja

Poput apstraktnih klasa, ne možemo stvoriti objekte sučelja. Međutim, možemo implementirati sučelje.

implementsKljučnu riječ koristimo za implementaciju sučelja. Na primjer,

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

Izlaz

 Površina pravokutnika je 30

U gornjem primjeru stvorili smo sučelje nazvano Poligon. Sučelje sadrži apstraktnu metodu getArea().

Ovdje klasa Rectangle implementira Poligon. I, pruža provedbu getArea()metode.

Napomena : Klasa može implementirati više sučelja. Na primjer,

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

Proširenje sučelja

Slično razredima, sučelja mogu proširiti i druga sučelja. extendsKljučna riječ upotrebljava za proširenje sučelja. Na primjer,

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

Ovdje poligonsko sučelje proširuje linijsko sučelje. Sada, ako bilo koja klasa implementira Polygon, trebala bi osigurati implementacije svih apstraktnih metoda Line-a i Polygona.

Napomena : Sučelje može proširiti više sučelja. Na primjer,

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

Prednosti sučelja u Javi

Sad kad znamo što su sučelja, naučimo zašto se sučelja koriste u Javi.

  • Sučelja pružaju specifikacije koje klasa (koja je implementira) mora slijediti.
    U našem prethodnom primjeru koristili smo se getArea()kao specifikacija unutar sučelja Poligon. Ovo je poput postavljanja pravila da bismo trebali moći dobiti površinu svakog poligona.
    Sada bilo koja klasa koja implementira Polygon sučelje mora osigurati implementaciju getArea()metode.
  • Slično apstraktnim klasama, sučelja nam pomažu u postizanju apstrakcije u Javi .
    Ovdje znamo kako getArea()izračunava površinu poligona, ali način na koji se izračunava površina različit je za različite poligone. Stoga je provedba getArea()neovisna jedna o drugoj.
  • Sučelja se također koriste za postizanje višestrukog nasljeđivanja u Javi. Na primjer,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Ovdje klasa Pravokutnik implementira dva različita sučelja. Tako postižemo višestruko nasljeđivanje u Javi.

zadane metode u Java sučeljima

Izdanjem Jave 8, sada možemo dodati metode s implementacijom unutar sučelja. Te se metode nazivaju zadanim metodama.

Da bismo deklarirali zadane metode unutar sučelja, koristimo defaultključnu riječ. Na primjer,

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

Zašto zadane metode?

Uzmimo scenarij da shvatimo zašto su zadane metode uvedene u Javi.

Pretpostavimo, trebamo dodati novu metodu u sučelje.

Metodu u naše sučelje možemo dodati lako bez implementacije. Međutim, tu nije kraj priče. Sve naše klase koje implementiraju to sučelje moraju osigurati implementaciju metode.

Ako je velik broj klasa implementirao ovo sučelje, moramo pratiti sve te klase i unijeti promjene u njih. Ovo nije samo zamorno već i sklono pogreškama.

Da bi to riješila, Java je uvela zadane metode. Zadane metode nasljeđuju se poput uobičajenih metoda.

Uzmimo primjer za bolje razumijevanje zadanih metoda.

Primjer: Zadana metoda u Java sučelju

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

Izlaz

Površina pravokutnika je 30 Imam 4 stranice. Površina kvadrata je 25 Mogu dobiti stranice mnogougla.

U gornjem primjeru stvorili smo sučelje nazvano Poligon. Ima zadanu metodu getSides()i apstraktnu metodu getArea().

Ovdje smo stvorili dvije klase Pravokutnik i kvadrat koji implementiraju Poligon.

Klasa Rectangle omogućuje provedbu getArea()metode i poništava je getSides(). Međutim, klasa Square pruža samo provedbu getArea()metode.

Sada, dok se getSides()metoda poziva pomoću objekta Rectangle , poziva se nadjačana metoda. Međutim, u slučaju objekta Square poziva se zadana metoda.

privatne i statičke metode u sučelju

Java 8 također je dodao još jednu značajku koja uključuje statičke metode unutar sučelja.

Slično klasi, i statičnim metodama sučelja možemo pristupiti pomoću njegovih referenci. Na primjer,

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

Međutim, pravilo za izračunavanje površine različito je za različite poligone. Stoga getArea()je uključen bez provedbe.

Svaka klasa koja implementira Poligon mora osigurati implementaciju getArea().

Zanimljivi članci...