Java er et objektorientert programmeringsspråk som lar utviklere lage komplekse programvaresystemer. En av nøkkelfunksjonene til Java er arv, som lar klasser arve egenskaper og metoder fra andre klasser. I Java kan en klasse bare utvide en overordnet klasse om gangen, men det er mulig å oppnå flere arvelignende atferd ved å bruke grensesnitt. I denne artikkelen vil vi utforske hvordan du utvider flere klasser i Java og gir eksempelprogrammer med utdata.
Utvide flere klasser i Java
Java tillater ikke at en klasse utvider flere klasser direkte. Grunnen til dette er å unngå Diamantproblemet, som oppstår når en klasse arver fra to klasser som har en felles superklasse. For å unngå dette problemet lar Java en klasse implementere flere grensesnitt, som kan oppnå lignende funksjonalitet.
Et grensesnitt er en samling abstrakte metoder som definerer oppførselen til en klasse. I motsetning til klasser kan ikke grensesnitt instansieres, men de kan implementeres av klasser. Ved å implementere et grensesnitt kan en klasse arve egenskaper og metoder fra flere grensesnitt. Det lar en klasse oppnå flere arvelignende atferd, uten diamantproblemet. For å utvide flere klasser i Java, må vi lage et grensesnitt som inneholder egenskapene og metodene til de overordnede klassene. Implementeringsklassen kan deretter implementere grensesnittet og arve egenskapene og metodene til de overordnede klassene. La oss ta en titt på et eksempel for å bedre forstå dette konseptet.
formater en dato i java
Utvide flere klasser i Java
I dette eksemplet vil vi lage tre klasser: Dyr, Pattedyr og Reptil. Vi vil da lage et grensesnitt kalt Omnivore, som vil utvide dyre- og pattedyrklassene. Til slutt vil vi lage en klasse kalt Platypus, som vil implementere Omnivore-grensesnittet.
Animal-klassen vil inneholde en metode som heter 'eat' som skriver ut 'Animal is eating'. Pattedyrklassen vil utvide dyreklassen og inneholde en metode kalt 'drinkMilk' som skriver ut 'Pattedyr drikker melk.' Reptilklassen vil også utvide dyreklassen og inneholde en metode som heter 'layEggs' som skriver ut 'Reptil legger egg.'
Her er koden for dyreklassen:
public class Animal { public void eat() { System.out.println('Animal is eating.'); } }
Her er koden for pattedyrklassen:
public class Mammal extends Animal { public void drinkMilk() { System.out.println('Mammal is drinking milk.'); } }
Her er koden for reptilklassen:
public class Reptile extends Animal { public void layEggs() { System.out.println('Reptile is laying eggs.'); } }
La oss nå lage Omnivore-grensesnittet, som vil utvide dyre- og pattedyrklassene:
public interface Omnivore extends Animal, Mammal { public void eatPlants(); }
Til slutt, la oss lage Platypus-klassen, som vil implementere Omnivore-grensesnittet:
linux kommandoer som
public class Platypus implements Omnivore { public void eat() { System.out.println('Platypus is eating.'); } public void drinkMilk() { System.out.println('Platypus is drinking milk.'); } public void eatPlants() { System.out.println('Platypus is eating plants.'); } }
I dette eksemplet implementerer Platypus-klassen Omnivore-grensesnittet, som utvider dyre- og pattedyrklassene. Derfor arver Platypus-klassen egenskapene og metodene til både dyre- og pattedyrklassene.
java-uttalelse
La oss teste programmet vårt ved å lage en forekomst av Platypus-klassen og kalle metodene:
public class Main { public static void main(String[] args) { Platypus p = new Platypus(); p.eat(); p.drinkMilk(); p.eatPlants(); } }
Produksjon:
Platypus is eating. Platypus is drinking milk. Platypus is eating plants.
Som vi kan se, er Platypus-klassen i stand til å arve egenskapene og metodene til både dyre- og pattedyrklassene ved å implementere Omnivore-grensesnittet. Dette lar oss oppnå flere arvelignende oppførsel i Java.
Når du skal bruke multiple arvelignende atferd i Java
Selv om det er mulig å oppnå flere arvelignende oppførsel i Java ved å bruke grensesnitt, er det ikke alltid nødvendig eller ønskelig. Faktisk hevder mange utviklere at multippel arv kan gjøre koden mer kompleks og vanskelig å vedlikeholde. Derfor er det viktig å nøye vurdere om multippel arvelignende atferd er nødvendig for programmet ditt.
En situasjon der flere arvelignende atferd kan være nyttig, er når du trenger å kombinere funksjonalitet fra flere kilder. Hvis du for eksempel har to klasser som gir forskjellige typer funksjonalitet, kan det være lurt å kombinere dem til en enkelt klasse som arver fra begge. I dette tilfellet kan det være en god løsning å implementere et grensesnitt som utvider begge klassene. En annen situasjon der flere arvelignende atferd kan være nyttig, er når du jobber med tredjepartsbiblioteker som bruker arv mye. Hvis du trenger å utvide flere tredjepartsklasser, kan implementering av grensesnitt være en god måte å oppnå dette på uten å lage komplekse arvehierarkier.
I Java er det ikke mulig å utvide flere klasser direkte. Imidlertid er det mulig å oppnå flere arvelignende atferd ved å implementere grensesnitt som utvider flere klasser. Dette gjør at en klasse kan arve egenskaper og metoder fra flere overordnede klasser, uten diamantproblemet som kan oppstå med direkte multippel arv. Selv om flere arvelignende atferd kan være nyttig i visse situasjoner, er det viktig å nøye vurdere om det er nødvendig for programmet ditt. I mange tilfeller kan bruk av grensesnitt og komposisjon være en bedre løsning for å kombinere funksjonalitet fra flere kilder.