Java liides (näidetega)

Selles õpetuses õpime tundma Java-liideseid. Saame näidete abil teada, kuidas liideseid rakendada ja millal neid üksikasjalikult kasutada.

Liides on täiesti abstraktne klass, mis sisaldab rühma meetodeid ilma kehata.

Javas määratleb liides spetsifikatsioonide komplekti, mida teised klassid peavad rakendama. Näiteks,

 interface Language ( public void getName(); )

Siin oleme interfacemärksõna kasutanud keele nimelise liidese loomiseks. Keeleliides määratleb spetsifikatsiooni getName().

Nüüd peaks iga seda liidest kasutav klass getName()spetsifikatsiooni rakendama .

Näide: Java liides

 // 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äljund

 Programmeerimiskeel: Java

Ülaltoodud näites oleme loonud liidese nimega Keel. Liides sisaldab abstraktset meetodit getName().

Klass ProgrammingLanguage rakendab siin liidese ja pakub meetodi rakendamist.

abstractLiidese sees abstraktsete meetodite deklareerimisel pole märksõna kasutamine kohustuslik . Seda seetõttu, et liides sisaldab ainult abstraktseid meetodeid, mitte tavalisi meetodeid.

Märkus . Kõik liidese sees olevad meetodid on kaudselt publicja kõik väljad kaudselt public static final. Näiteks,

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

Liidese rakendamine

Nagu abstraktsed klassid, ei saa me ka liidese objekte luua. Siiski saame liidese rakendada.

Kasutame implementsliidese juurutamiseks märksõna. Näiteks,

 // 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äljund

 Ristküliku pindala on 30

Ülaltoodud näites oleme loonud liidese nimega Polygon. Liides sisaldab abstraktset meetodit getArea().

Siin rakendab ristküliku klass hulknurka. Ja pakub getArea()meetodi rakendamist .

Märkus . Klass võib rakendada mitut liidest. Näiteks,

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

Liidese laiendamine

Sarnaselt klassidele võivad liidesed laiendada ka teisi liideseid. extendsMärksõna kasutatakse ulatub liidesed. Näiteks,

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

Siin laiendab Polygoni liides liidese liini. Kui mõni klass rakendab hulknurka, peaks see pakkuma rakendusi kõigile nii joone kui ka hulknurga abstraktsetele meetoditele.

Märkus . Liides võib laiendada mitut liidest. Näiteks,

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

Java liidese eelised

Nüüd, kui me teame, mis liidesed on, õpime tundma, miks Java-s liideseid kasutatakse.

  • Liidesed pakuvad spetsifikatsioone, mida klass (kes seda rakendab) peab järgima.
    Oma eelmises näites oleme kasutanud getArea()spetsifikatsioonina liidese Polygon sees. See on nagu reegli seadmine, et peaksime saama iga polügooni pindala.
    Nüüd peab iga klass, mis rakendab Polygoni liidest, pakkuma getArea()meetodile rakenduse .
  • Sarnaselt abstraktsetele klassidele aitavad liidesed meil Java-s abstraktsiooni saavutada .
    Siin teame, et getArea()arvutab hulknurkade pindala, kuid pindala arvutamise viis on erinevate hulktahukate jaoks erinev. Seega on rakendamine getArea()üksteisest sõltumatu.
  • Liideseid kasutatakse ka Java mitmekordse pärimise saavutamiseks. Näiteks,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Siin rakendab klass Rectangle kahte erinevat liidest. Nii saavutame Java-s mitmekordse pärimise.

Java-liideste vaikemeetodid

Java 8 väljaandmisega saame nüüd lisada liidese siseselt rakendusega meetodeid. Neid meetodeid nimetatakse vaikemeetoditeks.

Liideste siseselt vaikemeetodite kuulutamiseks kasutame defaultmärksõna. Näiteks,

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

Miks vaikemeetodid?

Võtame stsenaariumi, et mõista, miks vaikemeetodid Java-s juurutatakse.

Oletame, et peame liidesesse lisama uue meetodi.

Saame meetodi oma liidesesse hõlpsasti lisada ilma rakendamiseta. Sellega pole lugu siiski lõppenud. Kõik meie klassid, kes seda liidest rakendavad, peavad pakkuma meetodi rakendamist.

Kui seda liidest rakendasid paljud klassid, peame kõiki neid klasse jälgima ja neis muudatusi tegema. See pole mitte ainult tüütu, vaid ka vigadele kalduv.

Selle lahendamiseks tutvustas Java vaikemeetodeid. Vaikemeetodid on päritud nagu tavalised meetodid.

Võtame näite, et paremini mõista vaikemeetodeid.

Näide: Java-liidese vaikemeetod

 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äljund

Ristküliku pindala on 30, mul on 4 külge. Ruudu pindala on 25, mul on võimalik saada hulknurga külgi.

Ülaltoodud näites oleme loonud liidese nimega Polygon. Sellel on vaikemeetod getSides()ja abstraktne meetod getArea().

Siin oleme loonud kaks klassi Ristkülik ja Ruut, mis rakendavad hulknurka.

Ristküliku klass pakub getArea()meetodi rakendamist ja alistab getSides()meetodi. Klass Square pakub aga ainult getArea()meetodi rakendamist .

Nüüd, kui nimetatakse getSides()meetodit Rectangle (Ristkülik), nimetatakse alistatud meetodit. Ruudu objekti puhul kutsutakse aga vaikemeetodit.

privaatsed ja staatilised meetodid liideses

Java 8 lisas ka teise funktsiooni, et lisada liidese sisse staatilisi meetodeid.

Sarnaselt klassile on meil juurdepääs liidese staatilistele meetoditele, kasutades selle viiteid. Näiteks,

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

Pindala arvutamise reegel on aga erinevate hulknurkade puhul erinev. Seega getArea()kuulub ilma rakendamiseta.

Kõik klassid, mis rakendavad hulknurka, peavad pakkuma rakenduse getArea().

Huvitavad Artiklid...