Rozhraní Java (s příklady)

V tomto tutoriálu se dozvíme o rozhraních Java. Naučíme se, jak implementovat rozhraní a kdy je používat podrobně, pomocí příkladů.

Rozhraní je plně abstraktní třída, která zahrnuje skupinu metod bez těla.

V Javě rozhraní definuje sadu specifikací, které musí implementovat jiné třídy. Například,

 interface Language ( public void getName(); )

Zde jsme interfaceklíčové slovo použili k vytvoření rozhraní s názvem Language. Jazykové rozhraní definuje specifikaci getName().

Nyní by každá třída, která používá toto rozhraní, měla implementovat getName()specifikaci.

Příklad: Rozhraní 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ýstup

 Programovací jazyk: Java

Ve výše uvedeném příkladu jsme vytvořili rozhraní s názvem Language. Rozhraní obsahuje abstraktní metodu getName().

Tady třída ProgrammingLanguage implementuje rozhraní a poskytuje implementaci pro metodu.

abstractPři deklaraci abstraktních metod uvnitř rozhraní není povinné používat klíčové slovo. Protože rozhraní obsahuje pouze abstraktní metody, nikoli běžné metody.

Poznámka : Všechny metody uvnitř rozhraní jsou implicitně publica všechna pole jsou implicitně public static final. Například,

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

Implementace rozhraní

Stejně jako abstraktní třídy nemůžeme vytvářet objekty rozhraní. Můžeme však implementovat rozhraní.

implementsKlíčové slovo používáme k implementaci rozhraní. Napří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ýstup

 Plocha obdélníku je 30

Ve výše uvedeném příkladu jsme vytvořili rozhraní s názvem Polygon. Rozhraní obsahuje abstraktní metodu getArea().

Tady třída Rectangle implementuje Polygon. A poskytuje implementaci getArea()metody.

Poznámka : Třída může implementovat více rozhraní. Napří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šíření rozhraní

Podobně jako třídy mohou rozhraní rozšiřovat další rozhraní. extendsKlíčové slovo se používá pro prodloužení rozhraní. Například,

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

Zde rozhraní Polygon rozšiřuje rozhraní Line. Nyní, pokud některá třída implementuje Polygon, měla by poskytovat implementace pro všechny abstraktní metody Line i Polygon.

Poznámka : Rozhraní může rozšířit více rozhraní. Například,

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

Výhody rozhraní v Javě

Nyní, když víme, co jsou rozhraní, pojďme se dozvědět, proč se rozhraní používají v Javě.

  • Rozhraní poskytují specifikace, které musí třída (která ji implementuje) dodržovat.
    V našem předchozím příkladu jsme použili getArea()jako specifikaci uvnitř rozhraní Polygon. Je to jako nastavení pravidla, že bychom měli být schopni získat plochu každého polygonu.
    Nyní každá třída, která implementuje rozhraní Polygon, musí poskytnout implementaci getArea()metody.
  • Podobně jako u abstraktních tříd nám rozhraní pomáhají dosáhnout abstrakce v Javě .
    Tady víme, že se getArea()počítá plocha polygonů, ale způsob výpočtu plochy se u různých polygonů liší. Implementace getArea()je tedy na sobě nezávislá.
  • Rozhraní se také používají k dosažení vícenásobné dědičnosti v Javě. Například,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Tady třída Rectangle implementuje dvě různá rozhraní. Takto dosáhneme vícenásobné dědičnosti v Javě.

výchozí metody v rozhraní Java

S vydáním Java 8 nyní můžeme přidávat metody s implementací uvnitř rozhraní. Tyto metody se nazývají výchozí metody.

K deklaraci výchozích metod uvnitř rozhraní používáme defaultklíčové slovo. Například,

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

Proč výchozí metody?

Pojďme si udělat scénář, abychom pochopili, proč jsou v Javě zavedeny výchozí metody.

Předpokládejme, že musíme do rozhraní přidat novou metodu.

Metodu můžeme přidat do našeho rozhraní snadno bez implementace. Tím však příběh nekončí. Všechny naše třídy, které implementují toto rozhraní, musí poskytnout implementaci metody.

Pokud velké množství tříd implementovalo toto rozhraní, musíme sledovat všechny tyto třídy a provádět v nich změny. To je nejen zdlouhavé, ale také náchylné k chybám.

K vyřešení tohoto problému zavedla Java výchozí metody. Výchozí metody se dědí jako běžné metody.

Pojďme si vzít příklad, abychom lépe porozuměli výchozím metodám.

Příklad: Výchozí metoda 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ýstup

Plocha obdélníku je 30, mám 4 strany. Plocha čtverce je 25, mohu získat strany mnohoúhelníku.

Ve výše uvedeném příkladu jsme vytvořili rozhraní s názvem Polygon. Má výchozí metodu getSides()a abstraktní metodu getArea().

Zde jsme vytvořili dvě třídy Rectangle a Square, které implementují Polygon.

Třída Rectangle poskytuje implementaci getArea()metody a přepíše getSides()metodu. Třída Square však poskytuje pouze implementaci getArea()metody.

Při volání getSides()metody pomocí Rectangle objektu se nyní volá přepsaná metoda. V případě objektu Square je však volána výchozí metoda.

soukromé a statické metody v rozhraní

Java 8 také přidala další funkci, která zahrnovala statické metody uvnitř rozhraní.

Podobně jako třída, můžeme přistupovat ke statickým metodám rozhraní pomocí jeho odkazů. Napří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 pro výpočet plochy se však u různých polygonů liší. Proto getArea()je zahrnut bez implementace.

Jakákoli třída, která implementuje Polygon, musí poskytnout implementaci getArea().

Zajímavé články...