Java-grensesnitt

1. Oversikt

I denne opplæringen skal vi snakke om grensesnitt i Java. Vi får også se hvordan Java bruker dem til å implementere polymorfisme og flere arv.

2. Hva er grensesnitt i Java?

I Java er et grensesnitt en abstrakt type som inneholder en samling metoder og konstante variabler. Det er et av kjernekonseptene i Java og er brukes til å oppnå abstraksjon, polymorfisme og flere arv.

La oss se et enkelt eksempel på et grensesnitt i Java:

offentlig grensesnitt elektronisk {// konstant variabel streng 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 et grensesnitt i en Java-klasse ved å bruke redskaper nøkkelord.

La oss også lage en Datamaskin klasse som implementerer Elektronisk grensesnitt vi nettopp opprettet:

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

2.1. Regler for å lage grensesnitt

I et grensesnitt har vi lov til å bruke:

  • konstantvariabler
  • abstrakte metoder
  • statiske metoder
  • standardmetoder

Vi bør også huske at:

  • vi kan ikke instantiere grensesnitt direkte
  • et grensesnitt kan være tomt, uten metoder eller variabler i det
  • vi kan ikke bruke endelig ord i grensesnittdefinisjonen, da det vil resultere i en kompilatorfeil
  • alle grensesnittdeklarasjoner skal ha offentlig eller standard tilgangsmodifikator; de abstrakt modifikator vil bli lagt til automatisk av kompilatoren
  • en grensesnittmetode kan ikke være privat, beskyttet, eller endelig
  • grensesnittvariabler er offentlig, statisk, og endelig per definisjon; vi har ikke lov til å endre synligheten deres

3. Hva kan vi oppnå ved å bruke dem?

3.1. Atferdsmessig funksjonalitet

Vi bruker grensesnitt for å legge til visse atferdsmessige funksjonaliteter som kan brukes av ikke-relaterte klasser. For eksempel, Sammenlignelig, Komparator, og Klonbar er Java-grensesnitt som kan implementeres av ikke-relaterte klasser. Nedenfor er et eksempel på Komparator grensesnittsom brukes til å sammenligne to forekomster av Ansatt klasse:

offentlig ansatt {privat dobbeltlønn; offentlig dobbel getSalary () {returlønn; } public void setSalary (dobbel lønn) {this.salary = lønn; }} offentlig klasse EmployeeSalaryComparator implementerer Comparator {@Override public int compare (Employee employeeA, Employee employeeB) {if (employeeA.getSalary () ansatteB.getSalary ()) {retur 1; } annet {retur 0; }}} 

For mer informasjon, besøk vår veiledning på Komparator og Sammenlignelig i Java.

3.2. Flere arv

Java-klasser støtter enestående arv. Ved å bruke grensesnitt kan vi imidlertid implementere flere arv.

For eksempel, i eksemplet nedenfor, merker vi at Bil klasseimplementerer Fly og Forvandle grensesnitt. Ved å gjøre det arver det metodene fly og forvandle:

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

3.3. Polymorfisme

La oss starte med å stille spørsmålet: hva er polymorfisme? Det er muligheten for et objekt å ta forskjellige former i løpetid. For å være mer spesifikk er det utførelsen av overstyringsmetoden som er relatert til en bestemt objekttype ved kjøretid.

I Java kan vi oppnå polymorfisme ved hjelp av grensesnitt. For eksempel Form grensesnitt kan ta forskjellige former - det kan være et Sirkel eller a Torget.

La oss starte med å definere Form grensesnitt:

offentlig grensesnitt Shape {Strengnavn (); } 

La oss også lage Sirkel klasse:

public class Circle implementer Shape {@Override public String name () {return "Circle"; }} 

Og også Torget klasse:

offentlig klasse Square implementerer Shape {@Override public String name () {return "Square"; }} 

Endelig er det på tide å se polymorfisme i aksjon ved hjelp av vår Form grensesnitt og dets implementeringer. La oss instantiere noen Form objekter, legg dem til a Liste, og til slutt, skriv ut navnene i en løkke:

Listeformer = ny ArrayList (); Form sirkelForm = ny sirkel (); Form kvadratisk Form = ny firkant (); shapes.add (sirkelform); forms.add (kvadratform); for (Form form: figurer) {System.out.println (form.navn ()); } 

4. Standardmetoder i grensesnitt

Tradisjonelle grensesnitt i Java 7 og nyere tilbyr ikke bakoverkompatibilitet.

Hva dette betyr er at hvis du har eldre kode skrevet i Java 7 eller tidligere, og du bestemmer deg for å legge til en abstrakt metode i et eksisterende grensesnitt, så må alle klassene som implementerer det grensesnittet overstyre den nye abstrakte metoden. Ellers vil koden bryte.

Java 8 løste dette problemet ved å introdusere standardmetoden som er valgfritt og kan implementeres på grensesnittnivå.

5. Grensesnittarvregler

For å oppnå flere arv gjennom grensesnitt, må vi huske noen få regler. La oss gå gjennom disse i detalj.

5.1. Grensesnitt som utvider et annet grensesnitt

Når et grensesnitt strekker et annet grensesnitt, det arver alle grensesnittets abstrakte metoder. La oss starte med å lage to grensesnitt, HasColor og Form:

offentlig grensesnitt HasColor {String getColor (); } offentlig grensesnitt Box utvider HasColor {int getHeight ()} 

I eksemplet ovenfor, Eske arver fra HasColor ved hjelp av nøkkelordet strekker. Ved å gjøre det, Eske grensesnitt arver getColor. Som et resultat ble den Eske grensesnittet har nå to metoder: getColor og getHeight.

5.2. Abstrakt klasse som implementerer et grensesnitt

Når en abstrakt klasse implementerer et grensesnitt, arver den alle sine abstrakte og standardmetoder. La oss vurdere Forvandle grensesnitt og abstrakt klasse Kjøretøy som implementerer det:

offentlig grensesnitt Transform {void transform (); standard ugyldig printSpecs () {System.out.println ("Transform Specification"); }} offentlig abstrakt klasse kjøretøyredskaper Transform {} 

I dette eksemplet er Kjøretøy klasse arver to metoder: det abstrakte forvandle metode og standard utskriftSpesifikasjoner metode.

6. Funksjonelle grensesnitt

Java har hatt mange funksjonelle grensesnitt siden de tidlige dagene, for eksempel Sammenlignelig (siden Java 1.2) og Kjørbar (siden Java 1.0).

Java 8 introduserte nye funksjonelle grensesnitt som Predikere, Forbruker, og Funksjon. Hvis du vil lære mer om disse, kan du gå til veiledningen vår om funksjonelle grensesnitt i Java 8.

7. Konklusjon

I denne opplæringen ga vi en oversikt over Java-grensesnitt, og vi snakket om hvordan du kan bruke dem til å oppnå polymorfisme og flere arv.

Som alltid er de komplette kodeeksemplene tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found