Java-grænseflader

1. Oversigt

I denne vejledning skal vi tale om grænseflader i Java. Vi ser også, hvordan Java bruger dem til at implementere polymorfisme og flere arv.

2. Hvad er grænseflader i Java?

I Java er en grænseflade en abstrakt type, der indeholder en samling af metoder og konstante variabler. Det er et af kernebegreberne i Java og er bruges til at opnå abstraktion, polymorfisme og flere arv.

Lad os se et simpelt eksempel på en grænseflade i Java:

offentlig grænseflade Elektronisk {// Konstant variabel String LED = "LED"; // Abstrakt metode int getElectricityUse (); // Statisk metode statisk boolsk isEnergyEfficient (String electtronicType) {if (electtronicType.equals (LED)) {return true; } returner falsk; } // Standardmetode standard ugyldig printDescription () {System.out.println ("Elektronisk beskrivelse"); }} 

Vi kan implementere en grænseflade i en Java-klasse ved hjælp af redskaber nøgleord.

Lad os derefter også oprette en Computer klasse, der implementerer Elektronisk interface, vi lige har oprettet:

offentlig klasse Computer implementerer elektronisk {@Override public int getElectricityUse () {return 1000; }} 

2.1. Regler for oprettelse af grænseflader

I en grænseflade har vi lov til at bruge:

  • konstantvariabler
  • abstrakte metoder
  • statiske metoder
  • standardmetoder

Vi skal også huske at:

  • vi kan ikke instantiere grænseflader direkte
  • en grænseflade kan være tom uden metoder eller variabler i den
  • vi kan ikke bruge endelig ord i interface-definitionen, da det vil resultere i en kompilatorfejl
  • alle grænsefladedeklarationer skal have offentlig eller standard adgangsmodifikator; det abstrakt modifikator tilføjes automatisk af compileren
  • en interface-metode kan ikke være privat, beskyttet, eller endelig
  • interface variabler er offentlig, statiskog endelig Per definition; vi må ikke ændre deres synlighed

3. Hvad kan vi opnå ved at bruge dem?

3.1. Adfærdsmæssig funktionalitet

Vi bruger grænseflader til at tilføje visse adfærdsmæssige funktioner, der kan bruges af ikke-relaterede klasser. For eksempel, Sammenlignelig, Komparatorog Klonabel er Java-grænseflader, der kan implementeres af ikke-relaterede klasser. Nedenfor er et eksempel på Komparator interfaceder bruges til at sammenligne to forekomster af Medarbejder klasse:

offentlig klassemedarbejder {privat dobbelt løn; offentlig dobbelt getSalary () {returløn; } public void setSalary (dobbelt løn) {this.salary = løn; }} offentlig klasse EmployeeSalaryComparator implementerer Comparator {@Override public int compare (MedarbejdermedarbejderA, MedarbejdermedarbejderB) {hvis (medarbejderA.getSalary () medarbejderB.getSalary ()) {retur 1; } andet {retur 0; }}} 

For mere information, besøg vores vejledning om Komparator og Sammenlignelig i Java.

3.2. Flere arv

Java-klasser understøtter ental arv. Men ved hjælp af grænseflader er vi også i stand til at implementere flere arv.

For eksempel bemærker vi i eksemplet nedenfor, at Bil klasseimplementerer Flyve og Transformer grænseflader. Ved at gøre det arver det metoderne flyve og transformere:

offentlig grænseflade Transform {void transform (); } offentlig grænseflade Fly {ugyldig flyve (); } offentlig klasse bilimplementerer Fly, Transform {@Override public void fly () {System.out.println ("Jeg kan flyve !!"); } @ Override public void transform () {System.out.println ("Jeg kan transformere !!"); }} 

3.3. Polymorfisme

Lad os starte med at stille spørgsmålet: hvad er polymorfisme? Det er evnen for et objekt til at tage forskellige former under løbetiden. For at være mere specifik er det udførelsen af ​​tilsidesættelsesmetoden, der er relateret til en bestemt objekttype ved kørsel.

I Java kan vi opnå polymorfisme ved hjælp af grænseflader. F.eks Form interface kan tage forskellige former - det kan være en Cirkel eller a Firkant.

Lad os starte med at definere Form grænseflade:

offentlig grænseflade Shape {String name (); } 

Lad os nu også oprette Cirkel klasse:

offentlig klasse Cirkel implementerer figur {@ Override public String name () {return "Circle"; }} 

Og også Firkant klasse:

offentlig klasse Firkantede redskaber Form {@Override public String name () {return "Square"; }} 

Endelig er det tid til at se polymorfisme i aktion ved hjælp af vores Form interface og dets implementeringer. Lad os instantiere nogle Form genstande, tilføj dem til en Liste, og endelig udskrive deres navne i en løkke:

Listeformer = ny ArrayList (); Form cirkelForm = ny cirkel (); Form firkantet Form = ny firkant (); shapes.add (cirkelform); shapes.add (firkantet form); for (Form form: figurer) {System.out.println (form.navn ()); } 

4. Standardmetoder i grænseflader

Traditionelle grænseflader i Java 7 og derunder tilbyder ikke bagudkompatibilitet.

Hvad dette betyder er, at hvis du har en ældre kode skrevet i Java 7 eller tidligere, og du beslutter at tilføje en abstrakt metode til en eksisterende grænseflade, så skal alle de klasser, der implementerer grænsefladen, tilsidesætte den nye abstrakte metode. Ellers bryder koden.

Java 8 løste dette problem ved at indføre standardmetoden det er valgfrit og kan implementeres på grænsefladeniveau.

5. Grænseregler for arv

For at opnå flere arv gennem grænseflader er vi nødt til at huske et par regler. Lad os gå igennem disse detaljeret.

5.1. Interface udvider en anden interface

Når en grænseflade strækker sig en anden grænseflade, arver den alle grænseflades abstrakte metoder. Lad os starte med at oprette to grænseflader, Har farve og Form:

offentlig grænseflade HasColor {String getColor (); } offentlig grænseflade Box udvider HasColor {int getHeight ()} 

I eksemplet ovenfor, Boks arver fra Har farve ved hjælp af nøgleordet strækker sig. Ved at gøre dette, Boks interface arver getColor. Som et resultat af dette Boks interface har nu to metoder: getColor og getHeight.

5.2. Abstrakt klasse, der implementerer et interface

Når en abstrakt klasse implementerer en grænseflade, arver den alle dens abstrakte og standardmetoder. Lad os overveje Transformer interface og abstrakt klasse Køretøj der implementerer det:

offentlig grænseflade Transform {void transform (); standard ugyldig printSpecs () {System.out.println ("Transform Specification"); }} offentlig abstrakt klasse Køretøjsredskaber Transform {} 

I dette eksempel er Køretøj klasse arver to metoder: det abstrakte transformere metode og standard printSpecs metode.

6. Funktionelle grænseflader

Java har haft mange funktionelle grænseflader siden sine tidlige dage, såsom Sammenlignelig (siden Java 1.2) og Kan køres (siden Java 1.0).

Java 8 introducerede nye funktionelle grænseflader som f.eks Prædikat, Forbrugerog Fungere. For at lære mere om disse, besøg vores vejledning om funktionelle grænseflader i Java 8.

7. Konklusion

I denne vejledning gav vi et overblik over Java-grænseflader, og vi talte om, hvordan man bruger dem til at opnå polymorfisme og flere arv.

Som altid er de komplette kodeeksempler tilgængelige på GitHub.