Lezione Simulata

Ereditarietà

Introduzione: Cos'è l'Ereditarietà?

L'ereditarietà è uno dei pilastri della Programmazione Orientata agli Oggetti (OOP). Permette a una nuova classe (detta sottoclasse o classe figlia) di acquisire (ereditare) le caratteristiche (attributi) e i comportamenti (metodi) di una classe esistente (detta superclasse o classe madre). Immagina una relazione "genitore-figlio" tra classi.

Perché Usare l'Ereditarietà? I Vantaggi

L'ereditarietà offre vantaggi significativi:

Riuso del Codice: Evita di riscrivere codice comune, inserendolo nella superclasse.
Estendibilità: Le sottoclassi possono aggiungere nuove funzionalità specifiche.
Organizzazione Gerarchica: Modella relazioni "è un tipo di", rendendo il codice più comprensibile.
Polimorfismo: Apre la strada a comportamenti flessibili, che vedremo in seguito.

Terminologia Fondamentale

Superclasse: La classe da cui si eredita.
Sottoclasse: La classe che eredita.
La relazione è unidirezionale: la sottoclasse conosce la sua superclasse, ma non viceversa.

La Sintassi: La Parola Chiave extends

In Java, per stabilire una relazione di ereditarietà tra due classi, si utilizza la parola chiave extends. La sottoclasse "estende" la superclasse.

Esempio Pratico: La Superclasse Animale

Creiamo una superclasse generica Animale che definisce caratteristiche e comportamenti comuni a tutti gli animali.

Esempio Pratico: La Sottoclasse Cane

Ora creiamo una sottoclasse Cane che eredita da Animale, e aggiunge attributi e metodi specifici.

Utilizzo delle Classi: Creare Oggetti

Vediamo come creare oggetti e usare i metodi ereditati e specifici.

Modificatori di Accesso e Ereditarietà

I modificatori determinano cosa una sottoclasse può vedere o usare della superclasse: public, protected, default, private.

La Parola Chiave super (Costruttori)

super viene usato per chiamare il costruttore della superclasse dalla sottoclasse.

La Parola Chiave super (Metodi e Attributi)

super permette di accedere a metodi o attributi della superclasse, anche se sono stati ridefiniti.

Overriding dei Metodi (Sovrascrittura)

Una sottoclasse può fornire una propria versione di un metodo ereditato. Usa @Override per chiarezza e sicurezza.

L'Annotazione @Override

Aiuta il compilatore a rilevare errori nel sovrascrivere metodi. Obbliga a usare nomi e firme corretti.

Tipi di Ereditarietà in Java

Java supporta ereditarietà singola, multilivello e gerarchica, ma non l'ereditarietà multipla tra classi.

Esempio Pratico: Gerarchia di Veicolo

Una superclasse Veicolo con due sottoclassi: Automobile e Bicicletta, che ridefiniscono il metodo start().

Quando NON Usare l'Ereditarietà

Se la relazione è "HA UN" invece di "È UN", preferisci la **composizione**. Es: Automobile ha un Motore, non è un Motore.

Riepilogo dei Vantaggi

Riusabilità, Estendibilità, Mantenibilità, Chiarezza, e Polimorfismo sono tra i principali benefici dell’ereditarietà.