Contenuti del Corso
Java OOP
Java OOP
Principi OOP: Ereditarietà
Ereditarietà
Analizziamo il principio della OOP - Ereditarietà.
L'ereditarietà è un meccanismo che consente la creazione di classi basate su un'altra classe.
La classe che funge da base è chiamata classe genitore o superclasse;
La classe creata sulla base della classe genitore è chiamata classe figlia, sottoclasse o discendente.
In questo modo, la classe figlia può ereditare le caratteristiche e proprietà di un'altra classe - la classe genitore (i suoi metodi e variabili).
È possibile ereditare una classe utilizzando la parola chiave extends
. La sintassi per una classe figlia che eredita da una classe genitore è la seguente:
Child.java
class Child extends Parent { // properties and methods }
Vediamo un esempio di come funziona l'ereditarietà nel codice. Abbiamo una classe Bird
con determinati campi e metodi, e una classe Parrot
con i propri campi e metodi. Un pappagallo è un uccello, quindi logicamente il pappagallo dovrebbe ereditare dalla classe Bird
:
Ecco il codice dallo screenshot, riscritto per una migliore leggibilità e chiarezza:
Bird.java
Parrot.java
Main.java
package animals.birds; public class Bird { public String color; public boolean canFly; public int maxAge; public void eat() { System.out.println("The bird is eating"); } public void fly() { if (canFly) { System.out.println("The bird is flying!"); } else { System.out.println("This bird can't fly :("); } } }
Analizziamo cosa sta succedendo in queste immagini:
Creiamo una classe
Bird
, che in questo caso è la classe genitore. Questa classe possiede i propri campi e metodi;Creiamo una classe
Parrot
, che utilizza la parola chiaveextends
per ereditare dalla classe genitoreBird
. La classeParrot
è una classe figlia e possiede campi e metodi propri. Inoltre, come classe figlia,Parrot
eredita tutti i campi e i metodi della classe genitoreBird
;Creiamo un oggetto della classe
Parrot
nel metodomain
e vediamo che possiamo inizializzare i campi di entrambe le classi, sia genitore che figlia. Prima inizializziamo i campi della classe genitoreBird
, poi quelli della classe figliaParrot
. Successivamente, chiamiamo i metodi: prima quelli della classe genitore, poi il metodo della classe figlia.
In questo modo, abbiamo utilizzato l'ereditarietà per ereditare la classe Bird
.
Perché lo facciamo?
Quando abbiamo molte sottoclassi di Bird
, non solo Parrot
, ma ad esempio anche Pigeon
e Penguin
, avremo molti campi duplicati, come boolean canFly
. La prima cosa che l'ereditarietà aiuta a fare è evitare frammenti di codice duplicati.
Inoltre, migliora notevolmente la leggibilità. In pratica, raramente si incontrano direttamente la classe Bird
e le sue sottoclassi, ma l'ereditarietà è comunemente utilizzata, soprattutto con le interfacce.
Nota
Imparerai le interfacce nella prossima sezione di questo corso.
Regole dell'ereditarietà
Ereditare una sola classe. Java non supporta l'ereditarietà multipla. Una classe può avere solo un genitore;
Tutto viene ereditato tranne le variabili e i metodi
private
.
Nota
Non puoi ereditare da te stesso!
In precedenza, ho menzionato che una sottoclasse avrebbe accesso a tutte le variabili e i metodi della classe genitore. Tuttavia, questo non è del tutto vero.
In realtà, tutti i metodi e le variabili contrassegnati con il modificatore private
non sono accessibili alla sottoclasse.
Sovrascrivere il metodo della classe genitore.
Immaginiamo di ereditare una classe, ma ci sono alcune parti del codice ereditato che non ci piacciono. Supponiamo di voler far funzionare un metodo specifico in modo diverso rispetto alla classe genitore.
Per sovrascrivere un metodo della classe genitore, scriviamo @Override
sopra di esso:
Parrot.java
@Override public void eat() { System.out.println("The parrot is eating"); }
Nel codice sopra, abbiamo sovrascritto il metodo della classe genitore, e ora quando questo metodo viene chiamato dalla classe figlia, verrà invocato il metodo sovrascritto!
Prevenzione dell'ereditarietà.
Se non si desidera che la propria classe venga ereditata, utilizzare il modificatore final
prima di essa.
Ad esempio:
Bird.java
Parrot.java
public final class Bird { // fields and methods }
In questo modo, utilizzando la parola chiave final
, abbiamo vietato l'ereditarietà della classe Bird
.
Queste sono solo le regole fondamentali e le caratteristiche dell'ereditarietà. Si tratta di un argomento molto ampio, che utilizzerai molto frequentemente. Nel corso delle lezioni, acquisirai familiarità con altri aspetti dell'ereditarietà e li utilizzerai più spesso.
1. Perché abbiamo bisogno dell'ereditarietà in Java?
2. Da quante classi possiamo ereditare contemporaneamente?
3. Come possiamo impedire l'ereditarietà in Java?
Grazie per i tuoi commenti!