„Java“ sąsaja (su pavyzdžiais)

Šioje pamokoje sužinosime apie „Java“ sąsajas. Išmoksime, kaip įdiegti sąsajas ir kada jas išsamiai naudoti, pasitelkdami pavyzdžius.

Sąsaja yra visiškai abstrakti klasė, apimanti metodų grupę be kūno.

„Java“ sąsaja apibrėžia specifikacijų rinkinį, kurį turi įgyvendinti kitos klasės. Pavyzdžiui,

 interface Language ( public void getName(); )

Čia mes naudojome interfaceraktinį žodį, kad sukurtume sąsają pavadinimu Kalba. Kalbos sąsaja apibrėžia specifikaciją getName().

Dabar kiekviena klasė, naudojanti šią sąsają, turėtų įgyvendinti getName()specifikaciją.

Pavyzdys: „Java“ sąsaja

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

Rezultatas

 Programavimo kalba: Java

Ankstesniame pavyzdyje mes sukūrėme sąsają pavadinimu Kalba. Sąsajoje yra abstraktus metodas getName().

Čia „ProgrammingLanguage“ klasė įdiegia sąsają ir pateikia metodo įgyvendinimą.

abstractDeklaruojant abstrakčius metodus sąsajoje, nebūtina naudoti raktinio žodžio. Tai todėl, kad sąsaja apima tik abstrakčius metodus, o ne įprastus metodus.

Pastaba : visi sąsajoje esantys metodai yra numanomi, publico visi laukai - netiesiogiai public static final. Pavyzdžiui,

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

Sąsajos diegimas

Kaip ir abstrakčios klasės, mes negalime sukurti sąsajos objektų. Tačiau mes galime įdiegti sąsają.

Raktinį implementsžodį naudojame sąsajai įgyvendinti. Pavyzdžiui,

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

Rezultatas

 Stačiakampio plotas yra 30

Ankstesniame pavyzdyje mes sukūrėme sąsają pavadinimu Daugiakampis. Sąsajoje yra abstraktus metodas getArea().

Čia stačiakampio klasė įgyvendina daugiakampį. Ir pateikia getArea()metodo įgyvendinimą .

Pastaba : klasė gali įdiegti kelias sąsajas. Pavyzdžiui,

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

Sąsajos išplėtimas

Panašiai kaip klasėse, sąsajos gali išplėsti kitas sąsajas. extendsRaktažodis naudojamas išplėsti sąsajas. Pavyzdžiui,

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

Čia daugiakampio sąsaja pratęsia linijos sąsają. Dabar, jei kuri nors klasė įgyvendina daugiakampį, ji turėtų pateikti visų abstrakčių linijos ir daugiakampio metodų įgyvendinimus.

Pastaba : sąsaja gali išplėsti kelias sąsajas. Pavyzdžiui,

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

Sąsajos „Java“ pranašumai

Dabar, kai žinome, kas yra sąsajos, sužinokime, kodėl sąsajos naudojamos „Java“.

  • Sąsajose pateikiamos specifikacijos , kurių turi laikytis klasė (kuri ją įgyvendina).
    Ankstesniame pavyzdyje mes naudojome getArea()kaip daugiakampio sąsajos specifikaciją. Tai yra tarsi taisyklės nustatymas, kad mes turėtume sugebėti gauti kiekvieno daugiakampio plotą.
    Dabar bet kuri klasė, įdiegianti daugiakampio sąsają, turi pateikti getArea()metodo įgyvendinimą .
  • Panašiai kaip abstrakčios klasės, sąsajos mums padeda pasiekti abstrakciją „Java“ .
    Čia mes žinome, kad getArea()apskaičiuojamas daugiakampių plotas, tačiau skirtingų poligonų ploto apskaičiavimo būdas skiriasi. Taigi įgyvendinimas getArea()yra vienas nuo kito nepriklausomas.
  • Sąsajos taip pat naudojamos norint pasiekti daugkartinį „Java“ paveldėjimą. Pavyzdžiui,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Čia „Stačiakampis“ klasė įgyvendina dvi skirtingas sąsajas. Taip mes pasiekiame daugkartinį „Java“ paveldėjimą.

numatytieji „Java“ sąsajų metodai

Išleidę „Java 8“, sąsajoje galime pridėti metodų su įdiegimu. Šie metodai vadinami numatytaisiais.

Norėdami paskelbti numatytuosius metodus sąsajose, naudojame defaultraktinį žodį. Pavyzdžiui,

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

Kodėl numatytieji metodai?

Paimkime scenarijų, kad suprastume, kodėl numatytieji metodai įvedami „Java“.

Tarkime, mes turime į sąsają įtraukti naują metodą.

Metodą galime lengvai įtraukti į savo sąsają, jo neįdiegę. Tačiau tai dar ne viskas. Visos mūsų klasės, naudojančios tą sąsają, turi pateikti metodo įgyvendinimą.

Jei šią sąsają diegė daugybė klasių, turime sekti visas šias klases ir jose atlikti pakeitimus. Tai ne tik varginantis, bet ir linkęs į klaidas.

Norėdami tai išspręsti, „Java“ įdiegė numatytuosius metodus. Numatytieji metodai yra paveldimi kaip įprasti metodai.

Paimkime pavyzdį, kad geriau suprastumėte numatytuosius metodus.

Pavyzdys: Numatytasis „Java“ sąsajos metodas

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

Rezultatas

Stačiakampio plotas yra 30, aš turiu 4 kraštus. Kvadrato plotas yra 25, galiu gauti daugiakampio kraštus.

Ankstesniame pavyzdyje mes sukūrėme sąsają pavadinimu Daugiakampis. Jis turi numatytąjį metodą getSides()ir abstraktų metodą getArea().

Čia mes sukūrėme dvi stačiakampio ir kvadrato klases, kurios įgyvendina daugiakampį.

„Stačiakampio“ klasė suteikia getArea()metodo įgyvendinimą ir nepaiso getSides()metodo. Tačiau „Square“ klasė numato tik getArea()metodo įgyvendinimą .

Dabar, iškviečiant getSides()metodą naudojant objektą Rectangle, vadinamas nepaisomas metodas. Tačiau kvadratinio objekto atveju vadinamas numatytasis metodas.

privatūs ir statiniai sąsajos metodai

„Java 8“ taip pat pridėjo dar vieną funkciją, įtraukdama statinius metodus į sąsają.

Panašiai kaip klasėje, mes galime pasiekti statinius sąsajos metodus, naudodami jos nuorodas. Pavyzdžiui,

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

Tačiau ploto apskaičiavimo taisyklė skirtingiems daugiakampiams skiriasi. Taigi getArea()yra įtraukta neįgyvendinant.

Bet kuri klasė, įgyvendinanti daugiakampį, turi pateikti getArea().

Įdomios straipsniai...