Exerciții și întrebări - interfețe și clase abstracte
1. Enum
Întrebare: Care sunt principalele avantaje ale utilizării enum-urilor în comparație cu utilizarea constantelor statice (static final) în Java?
Exercițiu:
Creează un enum Anotimp
care conține cele patru anotimpuri. Adaugă pentru fiecare anotimp un atribut pentru temperatura medie și o metodă pentru a determina dacă este un anotimp cald sau rece. Apoi, scrie un program care parcurge toate valorile enum-ului și afișează detaliile despre fiecare anotimp.
2. Clase Abstracte
Întrebare: Care este diferența fundamentală între o clasă abstractă și o interfață în Java? În ce situații ai prefera utilizarea unei clase abstracte?
Exercițiu:
Creează o clasă abstractă InstrumentMuzical
care conține un atribut protejat pentru nume, un constructor, o metodă abstractă canta()
și o metodă concretă descriere()
. Apoi, creează cel puțin două clase concrete care extind această clasă abstractă: Chitara
și Pian
. Implementează metodele necesare și adaugă atribute și metode specifice fiecărui instrument.
3. Interfețe
Întrebare: De ce este utilă declararea și implementarea mai multor interfețe pentru aceeași clasă? Dă un exemplu de situație reală în care această abordare este benefică.
Exercițiu:
Creează două interfețe: Innotator
și Alergator
. Interfața Innotator
ar trebui să aibă o metodă inoata()
, iar interfața Alergator
ar trebui să aibă o metodă alearga()
. Apoi, creează cel puțin două clase care implementează ambele interfețe (de exemplu, Sportiv
și Animal
) și o clasă care implementează doar una dintre ele. Demonstrează utilizarea polimorfismului cu aceste interfețe.
4. Interfețe Funcționale
Întrebare: Ce este o interfață funcțională și care este legătura dintre interfețele funcționale și expresiile lambda în Java?
Exercițiu:
Definește o interfață funcțională proprie numită Procesor
care conține o metodă proceseaza
ce primește un String și returnează un alt String. Apoi, utilizează această interfață funcțională cu expresii lambda pentru a implementa cel puțin trei procesări diferite (de exemplu, conversie la majuscule, inversare de text, eliminare spații). Demonstrează utilizarea acestor procesări pe câteva exemple de texte.
5. Metode Default
Întrebare: Care a fost necesitatea introducerii metodelor default în interfețe începând cu Java 8? Ce problemă rezolvă acestea?
Exercițiu:
Creează o interfață Media
cu o metodă abstractă calculeazaMedia(int[] numere)
și o metodă default afiseazaRezultat(int[] numere)
care calculează media folosind metoda abstractă și apoi afișează rezultatul formatat. Implementează această interfață în cel puțin două clase diferite, una care calculează media aritmetică și una care calculează media geometrică. Apoi, suprascrie metoda default într-una din implementări pentru a personaliza formatul de afișare.
6. Metode Statice în Interfețe
Întrebare: Care este diferența dintre metodele statice din interfețe și metodele statice din clase? Cum sunt accesate metodele statice din interfețe?
Exercițiu:
Creează o interfață Conversie
care conține metode statice utilitare pentru convertirea între diferite unități de măsură (de exemplu, celsiusToFahrenheit
, kilometersToMiles
, kilogramsToPounds
). Adaugă apoi o metodă abstractă converteste(double valoare)
și implementează această interfață în mai multe clase pentru conversii specifice. Demonstrează utilizarea atât a metodelor statice, cât și a celor de instanță.
7. Clase Interne Statice
Întrebare: Care sunt avantajele utilizării unei clase interne statice în comparație cu o clasă de nivel superior (top-level class)?
Exercițiu:
Creează o clasă ListaGenerica
care implementează o listă simplă. În interiorul acestei clase, definește o clasă internă statică Element
care reprezintă un element din listă. Apoi, adaugă metode în clasa ListaGenerica
pentru adăugarea, eliminarea și afișarea elementelor, utilizând clasa internă statică. Demonstrează utilizarea acestei implementări.
8. Clase Interne de Instanță
Întrebare: Care este diferența principală între o clasă internă statică și o clasă internă de instanță? Ce tip de acces au clasele interne de instanță la membrii clasei exterioare?
Exercițiu:
Creează o clasă MasinaHibrid
care are atribute pentru nivelul bateriei și nivelul combustibilului. În interiorul acestei clase, definește o clasă internă de instanță SistemHibrid
care gestionează funcționarea mașinii și are acces la atributele mașinii. Adaugă metode pentru pornirea și oprirea mașinii, accelerare, frânare, etc., demonstrând cum clasa internă interacționează cu membrii clasei exterioare.
9. Clase Interne Locale
Întrebare: Ce restricții au clasele interne locale în comparație cu alte tipuri de clase interne? Ce tip de variabile locale pot fi accesate din cadrul unei clase interne locale?
Exercițiu:
Creează o clasă Generator
care are o metodă genereazaRaport(String tipRaport, int zile)
. În interiorul acestei metode, definește o clasă internă locală Raport
care implementează logica pentru generarea raportului în funcție de parametrii primiți. Demonstrează cum această clasă locală accesează parametrii metodei și membrii clasei exterioare.
10. Clase Interne Anonime
Întrebare: Care este diferența dintre o clasă internă anonimă și o expresie lambda? În ce situații este preferabilă utilizarea uneia față de cealaltă?
Exercițiu:
Creează o interfață Predicat
cu o metodă testeaza(Object obj)
care returnează un boolean. Apoi, utilizează o clasă internă anonimă pentru a implementa această interfață și a testa dacă un număr este prim. Implementează aceeași funcționalitate folosind o expresie lambda și compară cele două abordări. Demonstrează utilizarea acestor implementări pentru a filtra o listă de numere.
11. Exercițiu Complex
Creează o mică aplicație de gestionare a unei biblioteci care să demonstreze utilizarea conceptelor avansate discutate:
- Utilizează un enum
CategorieCarti
pentru a defini categoriile de cărți disponibile - Creează o clasă abstractă
Publicatie
de la care să derive claseleCarte
șiRevista
- Definește interfața
Imprumutabil
cu metodele necesare pentru împrumut și returnare - Adaugă o interfață funcțională
Cautare
pentru căutarea publicațiilor după diferite criterii - Implementează clase interne statice și de instanță pentru gestionarea detaliilor specifice
- Utilizează clase interne locale și anonime pentru implementarea logicii de sortare și filtrare
- Adaugă metode default și statice în interfețe pentru funcționalități comune
Demonstrează funcționarea aplicației printr-o clasă BibliotecaDemo
cu o metodă main
.