I denne opplæringen vil vi lære om Java-grensesnitt. Vi vil lære å implementere grensesnitt og når vi skal bruke dem i detalj ved hjelp av eksempler.
Et grensesnitt er en helt abstrakt klasse som inkluderer en gruppe metoder uten kropp.
I Java definerer et grensesnitt et sett med spesifikasjoner som andre klasser må implementere. For eksempel,
interface Language ( public void getName(); )
Her har vi brukt interface
nøkkelordet til å lage et grensesnitt som heter Language. Språkgrensesnittet definerer en spesifikasjon getName()
.
Nå skal hver klasse som bruker dette grensesnittet implementere getName()
spesifikasjonen.
Eksempel: Java-grensesnitt
// 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"); ) )
Produksjon
Programmeringsspråk: Java
I eksemplet ovenfor har vi opprettet et grensesnitt som heter Language. Grensesnittet inkluderer en abstrakt metode getName()
.
Her implementerer ProgrammingLanguage-klassen grensesnittet og gir implementeringen av metoden.
Det er ikke obligatorisk å bruke abstract
nøkkelord mens du erklærer abstrakte metoder i et grensesnitt. Det fordi et grensesnitt bare inkluderer abstrakte metoder, ikke vanlige metoder.
Merk : Alle metodene i et grensesnitt er implisitt public
og alle felt er implisitt public static final
. For eksempel,
interface Language ( // by default public static final String type = "programming language"; // by default public void getName(); )
Implementere et grensesnitt
Som abstrakte klasser, kan vi ikke lage objekter av et grensesnitt. Imidlertid kan vi implementere et grensesnitt.
Vi bruker implements
nøkkelordet for å implementere et grensesnitt. For eksempel,
// 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); ) )
Produksjon
Arealet til rektangelet er 30
I eksemplet ovenfor har vi opprettet et grensesnitt som heter Polygon. Grensesnittet inneholder en abstrakt metode getArea()
.
Her implementerer Rectangle-klassen Polygon. Og gir implementeringen av getArea()
metoden.
Merk : En klasse kan implementere flere grensesnitt. For eksempel,
interface A ( // members of A ) interface B ( // members of B ) class C implements A, B ( // abstract members of A // abstract members of B )
Utvide et grensesnitt
I likhet med klasser kan grensesnitt utvide andre grensesnitt. Den extends
nøkkelord blir brukt for å utvide grensesnitt. For eksempel,
interface Line ( // members of Line interface ) // extending interface interface Polygon extends Line ( // members of Polygon interface // members of Line interface )
Her utvider Polygon-grensesnittet Line-grensesnittet. Nå, hvis noen klasse implementerer Polygon, bør den gi implementeringer for alle de abstrakte metodene til både Line og Polygon.
Merk : Et grensesnitt kan utvide flere grensesnitt. For eksempel,
interface A (… ) interface B (… ) interface C extends A, B (… )
Fordeler med grensesnitt i Java
Nå som vi vet hva grensesnitt er, la oss lære om hvorfor grensesnitt brukes i Java.
- Grensesnitt gir spesifikasjoner som en klasse (som implementerer den) må følge.
I vårt forrige eksempel har vi bruktgetArea()
som en spesifikasjon inne i grensesnittet Polygon. Dette er som å sette en regel om at vi skal kunne få arealet til hver polygon.
Nå må enhver klasse som implementerer Polygon-grensesnittet gi en implementering avgetArea()
metoden. - I likhet med abstrakte klasser, hjelper grensesnitt oss med å oppnå abstraksjon i Java .
Her vet vi atgetArea()
beregner arealet til polygoner, men måten arealet beregnes på er forskjellig for forskjellige polygoner. Derfor er implementeringen avgetArea()
uavhengig av hverandre. - Grensesnitt brukes også til å oppnå flere arv i Java. For eksempel,
interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )
Her implementerer klassen Rektangel to forskjellige grensesnitt. Slik oppnår vi flere arv i Java.
standardmetoder i Java-grensesnitt
Med utgivelsen av Java 8 kan vi nå legge til metoder med implementering i et grensesnitt. Disse metodene kalles standardmetoder.
For å erklære standardmetoder i grensesnitt, bruker vi default
nøkkelordet. For eksempel,
public default void getSides() ( // body of getSides() )
Hvorfor standardmetoder?
La oss ta et scenario for å forstå hvorfor standardmetoder introduseres i Java.
Anta at vi må legge til en ny metode i et grensesnitt.
Vi kan enkelt legge til metoden i grensesnittet vårt uten implementering. Det er imidlertid ikke slutten på historien. Alle klassene våre som implementerer det grensesnittet, må gi en implementering av metoden.
Hvis et stort antall klasser implementerte dette grensesnittet, må vi spore alle disse klassene og gjøre endringer i dem. Dette er ikke bare kjedelig, men også feilutsatt.
For å løse dette introduserte Java standardmetoder. Standardmetoder arves som vanlige metoder.
La oss ta et eksempel for å få en bedre forståelse av standardmetoder.
Eksempel: Standardmetode i Java-grensesnitt
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(); ) )
Produksjon
Arealet til rektangelet er 30 jeg har 4 sider. Området på torget er 25 jeg kan få sider av en polygon.
I eksemplet ovenfor har vi opprettet et grensesnitt som heter Polygon. Den har en standardmetode getSides()
og en abstrakt metode getArea()
.
Her har vi opprettet to klasser Rektangel og Firkant som implementerer Polygon.
Rektangel-klassen gir implementeringen av getArea()
metoden og overstyrer getSides()
metoden. Imidlertid gir Square-klassen bare implementeringen av getArea()
metoden.
Nå, mens du kaller getSides()
metoden ved hjelp av Rectangle-objektet, kalles den overstyrte metoden. Imidlertid, når det gjelder Square-objektet, kalles standardmetoden.
private og statiske metoder i grensesnitt
Java 8 la også til en annen funksjon for å inkludere statiske metoder inne i et grensesnitt.
I likhet med en klasse kan vi få tilgang til statiske metoder for et grensesnitt ved hjelp av referansene. For eksempel,
// 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.
Regelen for å beregne arealet er imidlertid forskjellig for forskjellige polygoner. Derfor getArea()
er inkludert uten implementering.
Enhver klasse som implementerer Polygon må gi en implementering av getArea()
.