Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Ereditarietà in Java, Schemi e mappe concettuali di Programmazione Java

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

2025/2026

In vendita dal 17/04/2026

airruh
airruh 🇮🇹

4.7

(17)

73 documenti

1 / 8

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Ereditarietà in Java
Programmazione Orientata agli Oggetti – Lezione 8
Indice degli argomenti
• 1. Concetti di base sull'Ereditarietà
• 2. Overriding
• 3. Overriding vs Overloading
• 4. Modalità d'accesso: Variabili e Metodi Privati
pf3
pf4
pf5
pf8

Anteprima parziale del testo

Scarica Ereditarietà in Java e più Schemi e mappe concettuali in PDF di Programmazione Java solo su Docsity!

Ereditarietà in Java

Programmazione Orientata agli Oggetti – Lezione 8

Indice degli argomenti

    1. Concetti di base sull'Ereditarietà
    1. Overriding
    1. Overriding vs Overloading
    1. Modalità d'accesso: Variabili e Metodi Privati

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:

  • Riutilizzo del codice: la classe specializzata eredita tutte le proprietà della classe generale, riducendo la quantità di codice da scrivere.
  • Estendibilità: si aggiungono solo le nuove caratteristiche proprie della classe derivata.
  • Gerarchia naturale: le classi riflettono le relazioni del mondo reale.

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:

  • La nuova definizione sostituisce quella della classe base per gli oggetti della classe derivata. • Non si può cambiare la firma (signature) del metodo. • Il tipo di ritorno può essere

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

  • Il modificatore default consente accesso alle sottoclassi solo se si trovano nello stesso package.

Un membro dichiarato protected è accessibile:

  • dalla classe a cui appartiene,
  • dalle classi derivate (in qualsiasi package),
  • da qualsiasi classe dello stesso package (anche non derivata). Per le classi che non appartengono allo stesso package e non estendono la superclasse, un membro protected si comporta come private.

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

  • Ereditarietà : Permette di creare classi specializzate a partire da classi generali, riutilizzando metodi e variabili tramite extends.
  • Classe base / derivata : La classe base (superclasse/padre) viene estesa dalla classe derivata (sottoclasse/figlia).
  • super : Parola chiave usata nei costruttori della sottoclasse per invocare il costruttore della superclasse; usata anche per richiamare metodi ridefiniti della superclasse.
  • Overriding : Ridefinizione di un metodo con stessa firma nella sottoclasse. La versione della sottoclasse sostituisce quella della superclasse.
  • @Override : Annotazione che garantisce a compile-time che si stia eseguendo un overriding corretto.
  • Overloading : Stesso nome di metodo ma firma diversa. Non e' overriding; entrambe le versioni coesistono.
  • private : Membri non accessibili da nessuna altra classe, incluse le sottoclassi.
  • protected : Membri accessibili dalla classe, dalle sottoclassi e dal package; non da classi esterne al package.