




Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Indice degli argomenti • 1. Concetti di base sull'Ereditarietà • 2. Overriding • 3. Overriding vs Overloading • 4. Modalità d'accesso: Variabili e Metodi Privati
Tipologia: Schemi e mappe concettuali
1 / 8
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!





Indice degli argomenti
1. Concetti di base sull'Ereditarietà
L' ereditarietà è uno dei pilastri fondamentali della programmazione orientata agli oggetti. Permette di definire una classe generale e, successivamente, di creare classi specializzate che aggiungono nuovi dettagli alla classe di partenza, ereditando automaticamente metodi e variabili di istanza già definiti.
Vantaggi principali:
Caso di studio – Sistema universitario
Si consideri un programma per la gestione delle informazioni di un'università. Il sistema deve trattare studenti, docenti e altro personale. Tutti questi soggetti condividono informazioni comuni (nome, cognome, ecc.) perché sono, anzitutto, Persone.
Gerarchia di classi:
Classe Superclasse Note Persona — Classe radice con attributi comuni Studente Persona Aggiunge la matricola Dipendente Persona Include docenti e impiegati NonLaureato Studente Studente senza laurea LaureatoTriennale Studente Laurea di primo livello LaureatoMagistrale LaureatoTriennale Laurea di secondo livello Docente Dipendente Personale docente Impiegati Dipendente Personale amministrativo
La classe Persona in Java:
La classe Persona contiene le variabili di istanza e i metodi comuni a tutti i tipi di persona gestiti dal sistema:
public class Persona { private String nome; private String cognome; public Persona(String nome, String cognome) { this.nome = nome; this.cognome = cognome; } public Persona() { } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCognome() { return cognome; } public void setCognome(String cognome) { this.cognome = cognome; } public void stampaInfo() { System.out.println("Nome: " + nome + "\nCognome: " + cognome); } }
2. Overriding
L' overriding si verifica quando una classe derivata ridefinisce un metodo della classe base con lo stesso nome , gli stessi parametri (tipo, ordine, numero) e lo stesso tipo di ritorno. Per gli oggetti della classe derivata, la versione ridefinita sostituisce quella originale.
Esempio pratico:
La classe Persona ha il metodo stampaInfo(). La classe Studente lo ridefinisce per includere anche la matricola:
// Nella classe Studente: @Override public void stampaInfo() { System.out.println("Nome: " + getNome() + "\nCognome: " + getCognome()); System.out.println("Matricola: " + matricola); } // Utilizzo: Studente s = new Studente(); s.stampaInfo(); // usa la versione di Studente, non quella di Persona
Regole dell'overriding
Aspetto Regola Nome del metodo Deve essere identico Parametri Stessi in tipo, ordine e numero Tipo di ritorno Di norma identico; unica eccezione: se il tipo di ritorno e' una classe, si puo' restituire una sua Corpo del metodo Puo' essere completamente riscritto Modificatore d'accesso Puo' essere allargato (es. private -> public), mai ristretto (es. public -> private)
Tipo di ritorno – Eccezione (Covariant Return Type):
Se un metodo della classe base restituisce un tipo classe, il metodo ridefinito nella classe derivata può restituire qualsiasi discendente di quella classe:
// Classe base: public class ClasseBase { public Persona getInfo(String id) { ... } } // Classe derivata – VALIDO: Studente e' un discendente di Persona public class ClasseDerivata extends ClasseBase { @Override public Studente getInfo(String id) { ... } // OK }
Invocare il metodo della superclasse con super:
All'interno di un metodo ridefinito è possibile richiamare la versione originale della superclasse usando super.nomeMetodo(argomenti). Questo evita la ricorsione infinita che si avrebbe chiamando semplicemente il nome del metodo:
// Versione alternativa di stampaInfo() in Studente: @Override public void stampaInfo() { super.stampaInfo(); // stampa nome e cognome (versione di Persona) System.out.println("Matricola: " + matricola); } Riepilogo – Overriding:
ristretto a un discendente della classe originale. • Il modificatore d'accesso può solo essere reso più permissivo. • Per invocare il metodo originale della superclasse: super.nomeMetodo().
4. Modalità d'accesso: Variabili e Metodi Privati
Le variabili di istanza e i metodi dichiarati private in una classe base non sono accessibili per nome da nessun'altra classe, incluse le classi derivate. Questo vale anche se la sottoclasse eredita la classe che contiene quelle variabili private.
Soluzione: accedere tramite metodi pubblici ereditati
Il modo corretto per accedere alle variabili private della superclasse dalla sottoclasse è usare i metodi getter/setter pubblici ereditati:
// In Studente – accesso corretto tramite metodi getter ereditati: @Override public void stampaInfo() { System.out.println("Nome: " + getNome() + "\nCognome: " + getCognome()); System.out.println("Matricola: " + matricola); }
Il modificatore protected
Per consentire alle sottoclassi di accedere direttamente alle variabili di istanza della superclasse (senza getter), esiste il modificatore protected:
ModificatoreStessa classeStesso package SottoclassiTutte le classi private SI NO NO NO (default) SI SI NO* NO protected SI SI SI NO public SI SI SI SI
Un membro dichiarato protected è accessibile:
Esempio con protected:
Se le variabili nome e cognome fossero dichiarate protected in Persona:
public class Persona { protected String nome; protected String cognome; ... }
Il metodo stampaInfo() di Studente potrebbe accedere direttamente alle variabili per nome:
@Override public void stampaInfo() { System.out.println("Nome: " + nome + "\nCognome: " + cognome); System.out.println("Matricola: " + matricola); } Nota di buona pratica: sebbene protected sia comodo, dichiarare le variabili di istanza private e accedervi tramite getter/setter è generalmente preferibile per garantire un migliore incapsulamento e rendere il codice più manutenibile.
Riepilogo generale del modulo