Java je objektno orijentirani programski jezik koji programerima omogućuje stvaranje složenih softverskih sustava. Jedna od ključnih značajki Jave je nasljeđivanje, koje klasama omogućuje nasljeđivanje svojstava i metoda od drugih klasa. U Javi, klasa može proširiti samo jednu roditeljsku klasu u isto vrijeme, ali je moguće postići višestruko ponašanje slično nasljeđivanju korištenjem sučelja. U ovom ćemo članku istražiti kako proširiti više klasa u Javi i dati primjere programa s izlazom.
Proširivanje više klasa u Javi
Java ne dopušta da klasa izravno proširi više klasa. Razlog tome je izbjegavanje problema dijamanta, koji se javlja kada klasa naslijedi dvije klase koje imaju zajedničku superklasu. Kako bi se izbjegao ovaj problem, Java omogućuje klasi implementaciju višestrukih sučelja, koja mogu postići sličnu funkcionalnost.
Sučelje je zbirka apstraktnih metoda koje definiraju ponašanje klase. Za razliku od klasa, sučelja se ne mogu instancirati, ali se mogu implementirati klasama. Implementacijom sučelja, klasa može naslijediti svojstva i metode iz više sučelja. Omogućuje klasi postizanje ponašanja sličnog višestrukom nasljeđivanju, bez problema dijamanta. Kako bismo proširili više klasa u Javi, moramo stvoriti sučelje koje sadrži svojstva i metode roditeljskih klasa. Implementirajuća klasa tada može implementirati sučelje i naslijediti svojstva i metode roditeljskih klasa. Pogledajmo primjer kako bismo bolje razumjeli ovaj koncept.
zamijeni iz niza u Javi
Proširivanje više klasa u Javi
U ovom primjeru stvorit ćemo tri klase: Životinja, Sisavac i Reptil. Zatim ćemo stvoriti sučelje pod nazivom Omnivore, koje će proširiti klase Animal i Mammal. Konačno, stvorit ćemo klasu pod nazivom Platypus, koja će implementirati sučelje Omnivore.
Klasa Animal sadržavat će metodu pod nazivom 'eat' koja ispisuje 'Animal is eating.' Klasa Mammal će proširiti klasu Animal i sadržavati metodu pod nazivom 'drinkMilk' koja ispisuje 'Mammal is drinking milk'. Klasa Reptile također će proširiti klasu Animal i sadržavati metodu pod nazivom 'layEggs' koja ispisuje 'Reptile is laying eggs.'
Evo koda za klasu životinja:
public class Animal { public void eat() { System.out.println('Animal is eating.'); } }
Evo koda za klasu sisavaca:
public class Mammal extends Animal { public void drinkMilk() { System.out.println('Mammal is drinking milk.'); } }
Evo koda za klasu Reptile:
java arraylist sortiran
public class Reptile extends Animal { public void layEggs() { System.out.println('Reptile is laying eggs.'); } }
Kreirajmo sada sučelje Omnivore, koje će proširiti klase Animal i Mammal:
public interface Omnivore extends Animal, Mammal { public void eatPlants(); }
Na kraju, kreirajmo klasu Platypus koja će implementirati sučelje Omnivore:
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.'); } }
U ovom primjeru, klasa Platypus implementira sučelje Omnivore, koje proširuje klase Animal i Mammal. Stoga klasa Platypus nasljeđuje svojstva i metode i klase Životinje i Sisavci.
Testirajmo naš program stvaranjem instance klase Platypus i pozivanjem njezinih metoda:
bash za petlju 1 do 10
public class Main { public static void main(String[] args) { Platypus p = new Platypus(); p.eat(); p.drinkMilk(); p.eatPlants(); } }
Izlaz:
Platypus is eating. Platypus is drinking milk. Platypus is eating plants.
Kao što vidimo, klasa Platypus može naslijediti svojstva i metode klasa Animal i Mammal implementacijom sučelja Omnivore. To nam omogućuje postizanje ponašanja sličnog višestrukom nasljeđivanju u Javi.
Kada koristiti ponašanje slično višestrukom nasljeđivanju u Javi
Iako je moguće postići višestruko ponašanje slično nasljeđivanju u Javi korištenjem sučelja, to nije uvijek potrebno ili poželjno. Zapravo, mnogi programeri tvrde da višestruko nasljeđivanje može učiniti kod složenijim i težim za održavanje. Stoga je važno pažljivo razmotriti je li za vaš program potrebno ponašanje slično višestrukom nasljeđivanju.
Jedna situacija u kojoj ponašanje slično višestrukom nasljeđivanju može biti korisno je kada trebate kombinirati funkcionalnost iz više izvora. Na primjer, ako imate dvije klase koje pružaju različite vrste funkcionalnosti, možda ćete ih htjeti kombinirati u jednu klasu koja nasljeđuje obje. U ovom slučaju, implementacija sučelja koje proširuje obje klase može biti dobro rješenje. Još jedna situacija u kojoj ponašanje slično višestrukom nasljeđivanju može biti korisno je kada radite s bibliotekama trećih strana koje intenzivno koriste nasljeđivanje. Ako trebate proširiti više klasa trećih strana, implementacija sučelja može biti dobar način da to postignete bez stvaranja složenih hijerarhija nasljeđivanja.
U Javi nije moguće izravno proširiti više klasa. Međutim, moguće je postići ponašanje slično višestrukom nasljeđivanju implementacijom sučelja koja proširuju više klasa. Ovo omogućuje klasi da naslijedi svojstva i metode od više roditeljskih klasa, bez dijamantnog problema koji može nastati s izravnim višestrukim nasljeđivanjem. Iako ponašanje slično višestrukom nasljeđivanju može biti korisno u određenim situacijama, važno je pažljivo razmotriti je li potrebno za vaš program. U mnogim slučajevima korištenje sučelja i sastava može biti bolje rješenje za kombiniranje funkcionalnosti iz više izvora.