Rozhranie Java (s príkladmi)

V tomto výučbe sa dozvieme o rozhraniach Java. Naučíme sa, ako implementovať rozhrania a kedy ich podrobne používať, pomocou príkladov.

Rozhranie je úplne abstraktná trieda, ktorá obsahuje skupinu metód bez tela.

V Jave rozhranie definuje súbor špecifikácií, ktoré musia implementovať iné triedy. Napríklad,

 interface Language ( public void getName(); )

Tu sme pomocou interfacekľúčového slova vytvorili rozhranie s názvom Jazyk. Jazykové rozhranie definuje špecifikáciu getName().

Teraz by mala každá trieda, ktorá používa toto rozhranie, implementovať getName()špecifikáciu.

Príklad: Rozhranie 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"); ) )

Výkon

 Programovací jazyk: Java

Vo vyššie uvedenom príklade sme vytvorili rozhranie s názvom Jazyk. Rozhranie obsahuje abstraktnú metódu getName().

Trieda ProgrammingLanguage tu implementuje rozhranie a poskytuje implementáciu metódy.

abstractPri deklarácii abstraktných metód vo vnútri rozhrania nie je povinné používať kľúčové slovo. Pretože rozhranie obsahuje iba abstraktné metódy, nie bežné metódy.

Poznámka : Všetky metódy v rozhraní sú implicitne publica všetky polia sú implicitne public static final. Napríklad,

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

Implementácia rozhrania

Rovnako ako abstraktné triedy nemôžeme vytvárať objekty rozhrania. Môžeme však implementovať rozhranie.

implementsKľúčové slovo používame na implementáciu rozhrania. Napríklad,

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

Výkon

 Plocha obdĺžnika je 30

Vo vyššie uvedenom príklade sme vytvorili rozhranie s názvom Polygon. Rozhranie obsahuje abstraktnú metódu getArea().

Trieda Rectangle tu implementuje Polygon. A poskytuje implementáciu getArea()metódy.

Poznámka : Trieda môže implementovať viac rozhraní. Napríklad,

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

Rozšírenie rozhrania

Podobne ako triedy, aj rozhrania môžu rozširovať ďalšie rozhrania. extendsKľúčové slovo sa používa pre predĺženie rozhranie. Napríklad,

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

Tu rozhranie Polygon rozširuje rozhranie Line. Teraz, ak niektorá trieda implementuje Polygon, mala by poskytovať implementácie pre všetky abstraktné metódy Line aj Polygon.

Poznámka : Rozhranie môže rozšíriť viac rozhraní. Napríklad,

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

Výhody rozhrania v Jave

Teraz, keď vieme, čo sú rozhrania, poďme sa dozvedieť, prečo sa rozhrania používajú v prostredí Java.

  • Rozhrania poskytujú špecifikácie, ktoré musí trieda (ktorá ju implementuje) dodržiavať.
    V našom predchádzajúcom príklade sme použili getArea()ako špecifikáciu vnútri rozhrania Polygon. Je to ako nastavenie pravidla, že by sme mali byť schopní získať plochu každého mnohouholníka.
    Teraz musí každá trieda, ktorá implementuje rozhranie Polygon, poskytnúť implementáciu getArea()metódy.
  • Podobne ako v abstraktných triedach, aj rozhrania nám pomáhajú dosiahnuť abstrakciu v Jave .
    Vieme, že sa tu getArea()počíta plocha polygónov, ale spôsob výpočtu plochy sa pre rôzne polygóny líši. Implementácia getArea()je teda navzájom nezávislá.
  • Rozhrania sa tiež používajú na dosiahnutie viacnásobného dedičstva v Jave. Napríklad,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Trieda Rectangle tu implementuje dve rôzne rozhrania. Takto dosiahneme viacnásobné dedičstvo v Jave.

predvolené metódy v rozhraniach Java

S vydaním Java 8 môžeme teraz pridávať metódy s implementáciou vo vnútri rozhrania. Tieto metódy sa nazývajú predvolené metódy.

Na deklarovanie predvolených metód vo vnútri rozhraní používame defaultkľúčové slovo. Napríklad,

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

Prečo predvolené metódy?

Poďme si urobiť scenár, aby sme pochopili, prečo sa v Jave zavádzajú predvolené metódy.

Predpokladajme, že musíme do rozhrania pridať novú metódu.

Metódu môžeme pridať do nášho rozhrania ľahko bez implementácie. Týmto sa však príbeh nekončí. Všetky naše triedy, ktoré implementujú dané rozhranie, musia zabezpečiť implementáciu metódy.

Ak toto rozhranie implementovalo veľké množstvo tried, musíme všetky tieto triedy sledovať a vykonávať v nich zmeny. To je nielen zdĺhavé, ale aj náchylné na chyby.

Na vyriešenie tohto problému Java zaviedla predvolené metódy. Predvolené metódy sa dedia ako bežné metódy.

Vezmime si príklad, aby sme lepšie pochopili predvolené metódy.

Príklad: Predvolená metóda v rozhraní 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(); ) )

Výkon

Plocha obdĺžnika je 30 mám 4 strany. Plocha štvorca je 25. Môžem dostať strany mnohouholníka.

Vo vyššie uvedenom príklade sme vytvorili rozhranie s názvom Polygon. Má predvolenú metódu getSides()a abstraktnú metódu getArea().

Tu sme vytvorili dve triedy Obdĺžnik a Námestie, ktoré implementujú Polygon.

Trieda Rectangle poskytuje implementáciu getArea()metódy a má prednosť pred getSides()metódou. Trieda Square však poskytuje iba implementáciu getArea()metódy.

Teraz, keď sa volá getSides()metóda pomocou objektu Rectangle, volá sa prepísaná metóda. V prípade štvorcového objektu sa však volá predvolená metóda.

súkromné ​​a statické metódy v rozhraní

Java 8 tiež pridala ďalšiu funkciu na zahrnutie statických metód do rozhrania.

Podobne ako v triede, aj my môžeme pristupovať k statickým metódam rozhrania pomocou jeho referencií. Napríklad,

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

Pravidlo pre výpočet plochy je však pre rôzne mnohouholníky odlišné. Preto getArea()je zahrnutý bez implementácie.

Akákoľvek trieda, ktorá implementuje Polygon, musí poskytnúť implementáciu getArea().

Zaujímavé články...