În acest tutorial, vom afla despre interfețele Java. Vom învăța cum să implementăm interfețe și când să le folosim în detaliu cu ajutorul exemplelor.
O interfață este o clasă complet abstractă care include un grup de metode fără corp.
În Java, o interfață definește un set de specificații pe care alte clase trebuie să le implementeze. De exemplu,
interface Language ( public void getName(); )
Aici, am folosit interface
cuvântul cheie pentru a crea o interfață numită Limbă. Interfața Language definește o specificație getName()
.
Acum, fiecare clasă care folosește această interfață ar trebui să implementeze getName()
specificația.
Exemplu: Interfață 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"); ) )
Ieșire
Limbaj de programare: Java
În exemplul de mai sus, am creat o interfață numită Limbă. Interfața include o metodă abstractă getName()
.
Aici, clasa ProgrammingLanguage implementează interfața și oferă implementarea metodei.
Nu este obligatoriu să utilizați abstract
cuvinte cheie în timp ce declarați metode abstracte în interiorul unei interfețe. Deoarece o interfață include doar metode abstracte, nu metode obișnuite.
Notă : Toate metodele din interiorul unei interfețe sunt implicit public
și toate câmpurile sunt implicit public static final
. De exemplu,
interface Language ( // by default public static final String type = "programming language"; // by default public void getName(); )
Implementarea unei interfețe
La fel ca clasele abstracte, nu putem crea obiecte ale unei interfețe. Cu toate acestea, putem implementa o interfață.
Folosim implements
cuvântul cheie pentru a implementa o interfață. De exemplu,
// 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); ) )
Ieșire
Aria dreptunghiului este 30
În exemplul de mai sus, am creat o interfață numită Poligon. Interfața conține o metodă abstractă getArea()
.
Aici, clasa Rectangle implementează Polygon. Și oferă implementarea getArea()
metodei.
Notă : o clasă poate implementa mai multe interfețe. De exemplu,
interface A ( // members of A ) interface B ( // members of B ) class C implements A, B ( // abstract members of A // abstract members of B )
Extinderea unei interfețe
Similar claselor, interfețele pot extinde alte interfețe. Cuvântul extends
cheie este utilizat pentru extinderea interfețelor. De exemplu,
interface Line ( // members of Line interface ) // extending interface interface Polygon extends Line ( // members of Polygon interface // members of Line interface )
Aici, interfața Polygon extinde interfața Line. Acum, dacă orice clasă implementează Poligon, ar trebui să ofere implementări pentru toate metodele abstracte atât ale Liniei, cât și ale Poligonului.
Notă : o interfață poate extinde mai multe interfețe. De exemplu,
interface A (… ) interface B (… ) interface C extends A, B (… )
Avantajele interfeței în Java
Acum, că știm ce sunt interfețele, să aflăm de ce sunt utilizate interfețele în Java.
- Interfețele oferă specificații pe care trebuie să le urmeze o clasă (care o implementează).
În exemplul nostru anterior, am folositgetArea()
ca specificație în interfața Poligon. Este ca și cum ați stabili o regulă care ar trebui să putem obține aria fiecărui poligon.
Acum, orice clasă care implementează interfața Polygon trebuie să ofere o implementare pentrugetArea()
metodă. - Similar claselor abstracte, interfețele ne ajută să realizăm abstractizarea în Java .
Aici, știm căgetArea()
calculează aria poligoanelor, dar modul în care este calculată aria este diferit pentru poligoane diferite. Prin urmare, implementareagetArea()
este independentă una de cealaltă. - Interfețele sunt, de asemenea, utilizate pentru a obține moștenirea multiplă în Java. De exemplu,
interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )
Aici, clasa Rectangle implementează două interfețe diferite. Așa realizăm moștenirea multiplă în Java.
metode implicite în interfețele Java
Odată cu lansarea Java 8, putem adăuga acum metode cu implementare într-o interfață. Aceste metode se numesc metode implicite.
Pentru a declara metodele implicite în interiorul interfețelor, folosim default
cuvântul cheie. De exemplu,
public default void getSides() ( // body of getSides() )
De ce metodele implicite?
Să luăm un scenariu pentru a înțelege de ce metodele implicite sunt introduse în Java.
Să presupunem că trebuie să adăugăm o nouă metodă într-o interfață.
Putem adăuga metoda în interfața noastră cu ușurință, fără implementare. Cu toate acestea, acesta nu este sfârșitul poveștii. Toate clasele noastre care implementează acea interfață trebuie să ofere o implementare pentru metodă.
Dacă un număr mare de clase implementau această interfață, trebuie să urmărim toate aceste clase și să le modificăm. Acest lucru nu este doar obositor, ci și predispus la erori.
Pentru a rezolva acest lucru, Java a introdus metode implicite. Metodele implicite sunt moștenite ca metodele obișnuite.
Să luăm un exemplu pentru a înțelege mai bine metodele implicite.
Exemplu: Metoda implicită în interfața 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(); ) )
Ieșire
Aria dreptunghiului este 30 Am 4 laturi. Suprafața pătratului este de 25 Pot obține laturi ale unui poligon.
În exemplul de mai sus, am creat o interfață numită Poligon. Are o metodă implicită getSides()
și o metodă abstractă getArea()
.
Aici, am creat două clase Rectangle și Square care implementează Polygon.
Clasa Rectangle oferă implementarea getArea()
metodei și suprascrie getSides()
metoda. Cu toate acestea, clasa Square oferă doar implementarea getArea()
metodei.
Acum, în timp ce se apelează getSides()
metoda folosind obiectul Rectangle, se apelează metoda suprascrisă. Cu toate acestea, în cazul obiectului Square, se apelează metoda implicită.
Metode private și statice în interfață
Java 8 a adăugat, de asemenea, o altă caracteristică pentru a include metode statice în interiorul unei interfețe.
Similar unei clase, putem accesa metodele statice ale unei interfețe folosind referințele acesteia. De exemplu,
// 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.
Cu toate acestea, regula pentru calcularea ariei este diferită pentru poligoane diferite. Prin urmare, getArea()
este inclus fără implementare.
Orice clasă care implementează Polygon trebuie să ofere o implementare a getArea()
.