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 interface
mä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.
abstract
Liidese 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 public
ja 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 implements
liidese 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. extends
Mä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 kasutanudgetArea()
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, pakkumagetArea()
meetodile rakenduse . - Sarnaselt abstraktsetele klassidele aitavad liidesed meil Java-s abstraktsiooni saavutada .
Siin teame, etgetArea()
arvutab hulknurkade pindala, kuid pindala arvutamise viis on erinevate hulktahukate jaoks erinev. Seega on rakendaminegetArea()
ü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 default
mä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()
.