Java-käyttöliittymä (esimerkkien kanssa)

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

abstractAvainsanan 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 publicja 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 implementsavainsanaa 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. extendsAvainsanaa 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äneet getArea()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 tarjottava getArea()menetelmälle toteutus .
  • Samoin kuin abstraktit luokat, rajapinnat auttavat meitä saavuttamaan abstraktion Java-muodossa .
    Tässä tiedämme getArea()laskevan polygonien pinta-alan, mutta tapa, jolla pinta-ala lasketaan, on erilainen eri polygoneille. Näin ollen järjestelmän toteutus getArea()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ä defaultavainsanaa. 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().

Mielenkiintoisia artikkeleita...