Nel linguaggio Java ci troviamo sovente di fronte alla modellazione di un mondo per il quale è sconveniente scrivere una classe per ogni oggetto che contenga tutte le caratteristiche, in quanto gli oggetti possono avere caratteristiche comuni o possono rispecchiare un naturale ordine gerarchico.
Il concetto di ereditarietà ci viene in aiuto in questo senso.
Ma cos’è l’ ereditarietà?
L’ereditarietà è il meccanismo tramite il quale un oggetto è in una relazione logica con un altro nel tipo “è un”.
Ad esempio, se modelliamo la classe persona e la classe studente di Ingengeria, vien naturale sostenere “lo studente di ingengneria è una persona” e quindi un oggetto studente di ingengneria ha tutte le caratteristiche della persona
(notate che non è vero il contrario, non tutte le persone son studenti di Ingegneria).
La classe Persona è detta superclasse cioè la classe più “generale” (quella preesistente);
Mentre la classe studente di ingegneria è detta sottoclasse cioè la nuova classe più “specializzata” (oggetti più ricchi).
La sintassi per estendere una (super)classe ereditandone struttura e funzionalità è:
public class <nuova_(sotto)classe>
extends <vecchia_(super)classe> {
<nuove_variabili_istanza>
<nuovi_metodi>
}
Un esempio: la classe Persona
public class Persona {
String nome;
String città_nascita;
public Persona() {
this("John Doe","ignota");
}
public Persona(String nome) {
this(nome,"ignoto");
}
public Persona(String nome, String citta_nascita) {
this.nome = nome;
this.citta_nascita = citta_nascita;
}
public String getNome() {
return nome;
}
public String getCitta_nascita() {
return indirizzo;
}
public void visualizza() {
System.out.println("Nome: " + nome + "\ncitta_nascita: " + citta_nascita);
}
public boolean omonimo(Persona p) {
return this.nome.equalsIgnoreCase(p.nome);
}
...
}
La sottoclasse Studente
Vogliamo definire una classe Studente, che rappresenti gli studenti iscritti ad un corso di Ingegneria.
Ogni studente è descritto dal nome, dall’indirizzo, dal numero di matricola e dal piano di studio.
Uno Studente è un tipo particolare di Persona.
L’ereditarietà ci consente di definire questa classe senza ripetere la descrizione di tutte le variabili e i metodi di Persona, ma procedendo invece in modo incrementale:
public class Studente extends Persona {
// Studente eredita variabili e metodi da Persona
int matricola; // Nuova variabile istanza
String pianoDiStudio; // Nuova variabile istanza
// Nuova variabile statica (di classe)
static int nextMatricola = 1;
// Costruttore
public Studente(String nome, String citta_nascita) {
this.nome = nome;
this.citta_nascita = citta_nascita;
this.matricola = nextMatricola++;
this.pianoDiStudio = "";
}
// Nuovo metodo
public String getPdS() {
return pianoDiStudio;
}
// Nuovo metodo
public void modificaPdS(String nuovoPdS) {
pianoDiStudio += nuovoPdS + "\n";
}
...
}
La parola chiave extends significa che
Studente è una sottoclasse o classe derivata di Persona.
Persona è una superclasse o classe genitrice di Studente


