Tässä opetusohjelmassa opit Java-rajapinnoista. Opimme esimerkkien avulla, miten rajapinnat otetaan käyttöön ja milloin niitä käytetään.
Käyttöliittymä on täysin abstrakti luokka, joka sisältää joukon menetelmiä ilman runkoa.
Java-käyttöliittymä määrittelee joukon määrityksiä, jotka muiden luokkien on toteutettava. Esimerkiksi,
interface Language ( public void getName(); )
Tässä olemme käyttäneet interface
avainsanaa Kielen-nimisen käyttöliittymän luomiseen. Kielirajapinta määrittelee erittelyn getName()
.
Jokaisen luokan, joka käyttää tätä liitäntää, tulisi nyt toteuttaa getName()
määrittely.
Esimerkki: Java-käyttöliittymä
// 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"); ) )
Tuotos
Ohjelmointikieli: Java
Yllä olevassa esimerkissä olemme luoneet käyttöliittymän nimeltä Kieli. Käyttöliittymä sisältää abstraktin menetelmän getName()
.
Tässä ProgrammingLanguage-luokka toteuttaa käyttöliittymän ja tarjoaa menetelmän toteutuksen.
abstract
Avainsanan käyttö ei ole pakollista ilmoitettaessa abstrakteja menetelmiä käyttöliittymän sisällä. Koska käyttöliittymä sisältää vain abstrakteja menetelmiä, ei säännöllisiä menetelmiä.
Huomaa : Kaikki käyttöliittymän sisällä olevat menetelmät ovat implisiittisesti public
ja kaikki kentät implisiittisesti public static final
. Esimerkiksi,
interface Language ( // by default public static final String type = "programming language"; // by default public void getName(); )
Käyttöliittymän käyttöönotto
Kuten abstraktit luokat, emme voi luoda käyttöliittymän objekteja. Voimme kuitenkin toteuttaa käyttöliittymän.
Käytämme implements
avainsanaa käyttöliittymän toteuttamiseen. Esimerkiksi,
// 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); ) )
Tuotos
Suorakulmion pinta-ala on 30
Yllä olevassa esimerkissä olemme luoneet käyttöliittymän nimeltä Polygon. Käyttöliittymä sisältää abstraktin menetelmän getArea()
.
Tässä suorakulmion luokka toteuttaa monikulmion. Ja tarjoaa getArea()
menetelmän toteuttamisen.
Huomaa : Luokka voi toteuttaa useita rajapintoja. Esimerkiksi,
interface A ( // members of A ) interface B ( // members of B ) class C implements A, B ( // abstract members of A // abstract members of B )
Liitännän laajentaminen
Samoin kuin luokissa, rajapinnat voivat laajentaa muita rajapintoja. extends
Avainsanaa käytetään ulottuu rajapintoja. Esimerkiksi,
interface Line ( // members of Line interface ) // extending interface interface Polygon extends Line ( // members of Polygon interface // members of Line interface )
Tässä monikulmaliitäntä laajentaa linjarajapintaa. Jos jokin luokka toteuttaa monikulmion, sen tulisi tarjota toteutuksia kaikille linjan ja monikulmion abstrakteille menetelmille.
Huomaa : Liitäntä voi laajentaa useita käyttöliittymiä. Esimerkiksi,
interface A (… ) interface B (… ) interface C extends A, B (… )
Java-käyttöliittymän edut
Nyt kun tiedämme, mitä käyttöliittymiä on, opitaan, miksi käyttöliittymiä käytetään Javassa.
- Liitännät tarjoavat eritelmiä, joita luokan (joka toteuttaa sen) on noudatettava.
Edellisessä esimerkissämme olemme käyttäneetgetArea()
määrittelyä Polygon-käyttöliittymän sisällä. Tämä on kuin sellaisen säännön asettaminen, että meidän pitäisi pystyä saamaan jokaisen polygonin pinta-ala.
Nyt minkä tahansa luokan, joka toteuttaa Polygon-käyttöliittymän, on tarjottavagetArea()
menetelmälle toteutus . - Samoin kuin abstraktit luokat, rajapinnat auttavat meitä saavuttamaan abstraktion Java-muodossa .
Tässä tiedämmegetArea()
laskevan polygonien pinta-alan, mutta tapa, jolla pinta-ala lasketaan, on erilainen eri polygoneille. Näin ollen järjestelmän toteutusgetArea()
on toisistaan riippumatonta. - Liitäntöjä käytetään myös useiden perintöjen saavuttamiseen Java-sovelluksessa. Esimerkiksi,
interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )
Tässä suorakulmion luokka toteuttaa kaksi erilaista rajapintaa. Näin saavutamme moninkertaisen perinnön Java-sovelluksessa.
Java-rajapintojen oletusmenetelmät
Java 8: n julkaisemisen myötä voimme nyt lisätä menetelmiä, joissa toteutus on käyttöliittymän sisällä. Näitä menetelmiä kutsutaan oletusmenetelmiksi.
Ilmoitamme oletusmenetelmät käyttöliittymien sisällä käyttämällä default
avainsanaa. Esimerkiksi,
public default void getSides() ( // body of getSides() )
Miksi oletusmenetelmät?
Otetaan skenaario ymmärtääksemme miksi Java-menetelmissä otetaan käyttöön oletusmenetelmät.
Oletetaan, että meidän on lisättävä uusi menetelmä käyttöliittymään.
Voimme lisätä menetelmän käyttöliittymäämme helposti ilman toteutusta. Tämä ei kuitenkaan ole tarinan loppu. Kaikkien luokkien, jotka toteuttavat kyseisen käyttöliittymän, on tarjottava menetelmälle toteutus.
Jos suuri määrä luokkia otti käyttöön tämän käyttöliittymän, meidän on seurattava kaikkia näitä luokkia ja tehtävä niihin muutoksia. Tämä ei ole vain tylsiä, vaan myös altis virheille.
Tämän ratkaisemiseksi Java otti käyttöön oletusmenetelmät. Oletusmenetelmät peritään kuten tavalliset menetelmät.
Otetaan esimerkki, jotta oletusmenetelmät ymmärrettäisiin paremmin.
Esimerkki: Oletusmenetelmä Java-käyttöliittymässä
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(); ) )
Tuotos
Suorakulmion pinta-ala on 30, minulla on 4 sivua. Neliön pinta-ala on 25, saan monikulmion sivut.
Yllä olevassa esimerkissä olemme luoneet käyttöliittymän nimeltä Polygon. Sillä on oletusmenetelmä getSides()
ja abstrakti menetelmä getArea()
.
Tässä olemme luoneet kaksi suorakulmion ja neliön luokkaa, jotka toteuttavat monikulmion.
Suorakulmio-luokka tarjoaa getArea()
menetelmän toteutuksen ja ohittaa getSides()
menetelmän. Square-luokka tarjoaa kuitenkin vain getArea()
menetelmän toteutuksen .
Nyt kun kutsutaan getSides()
menetelmää suorakulmiobjektilla, kutsutaan ohitettua menetelmää. Neliö-objektin tapauksessa kutsutaan kuitenkin oletusmenetelmää.
yksityiset ja staattiset menetelmät käyttöliittymässä
Java 8 lisäsi myös toisen ominaisuuden sisällyttämään staattisia menetelmiä käyttöliittymän sisälle.
Samoin kuin luokassa, voimme käyttää rajapinnan staattisia menetelmiä sen viitteiden avulla. Esimerkiksi,
// 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.
Pinta-alan laskemista koskeva sääntö on kuitenkin erilainen eri polygoneille. Näin ollen getArea()
sisältyy ilman toteutusta.
Kaikkien luokkien, jotka toteuttavat monikulmioita, on tarjottava toteutus getArea()
.