- Ereditarietà
L’ereditarietà sebbene sia un argomento semplice da
comprendere, genera una serie di nuovi concetti da acquisire
affinché sia gestita in maniera corretta. Essa è la caratteristica
della programmazione ad oggetti che mette in relazione di
estensibilità più classi che hanno caratteristiche comuni. Come
risultato avremo la possibilità di ereditare codice già scritto (e
magari già testato), e quindi di gestire gruppi di classi
collettivamente, giacché accomunate da caratteristiche comuni. Le
regole per gestire correttamente l’ereditarietà sono semplici e
chiare.
- La parola chiave "extends":
Ad esempio, consideriamo le seguenti classi:
class Libro
{
public int numeroPagine;
public int prezzo;
public String autore;
public String editore;
. . .
}
class LibroSuJava
{
public int numeroPagine;
public int prezzo;
public String autore;
public String editore;
public final String argomentoTrattato="Java";
. . .
}
Notiamo che queste due classi dichiarano dei campi
in comune e ciò può apparire "non naturale" agli occhi del
programmatore. In effetti, l’ereditarietà ci permetterà di scrivere:
class LibroSuJava extends Libro
{
public final String argomentoTrattato="Java";
. . .
}
In questo modo, la classe
LibroSuJava erediterà tutti i campi pubblici della classe che
estende. Quindi, anche se non sono state codificate esplicitamente,
nella classe LibroSuJava sono presenti anche le variabili pubbliche
numeroPagine, prezzo, autore ed editore. In particolare diremo che
LibroSuJava è "sottoclasse" di Libro, e Libro è "superclasse" di
LibroSuJava.
- Ereditarietà multipla ed interfacce:
In Java non esiste la cosiddetta
"ereditarietà multipla" così come esiste in C++. Questa permette ad
una classe di estendere più classi contemporaneamente. Ciò infatti è
spesso causa di problemi implementativi, a cui il programmatore deve
poi rimediare. In Java è quindi stata fatta ancora una volta una
scelta a favore della robustezza, ma a discapito della potenza del
linguaggio, ed ogni classe potrà estendere una sola classe alla
volta. In compenso però, tramite il concetto di "interfaccia", Java
offre supporto ad un meccanismo di simulazione dell’ereditarietà
multipla. Questa simulazione, non presenta ambiguità, e sarà
presentata nel modulo 9.
- La classe Object:
Come abbiamo già osservato più
volte, il compilatore Java inserisce spesso nel byte-code compilato,
alcune istruzioni che il programmatore non ha inserito. Questo,
sempre per far sì che Java sia considerato "semplice". Abbiamo già
detto che la programmazione ad oggetti si ispira a concetti reali.
Tutta la libreria standard di Java è stata pensata ed organizzata in
maniera tale da soddisfare la teoria degli oggetti. Ora, siccome la
realtà è composta da oggetti (tutto può considerarsi un oggetto, sia
elementi concretamente esistenti, sia concetti astratti), nella
libreria standard di Java esiste una classe chiamata Object, che
astrae il concetto di oggetto generico. Esso appartiene al package
java.lang ed è di fatto la superclasse di ogni classe. È alla cima
della gerarchia delle classi, e quindi tutte le classi ereditano i
membri di Object. Se definiamo una classe che non estende altre
classi, essa automaticamente estenderà Object. Il che significa che
se scrivessimo:
il compilatore in realtà "scriverà"
questa classe nel seguente modo:
class Arte extends Object
{
. . .
}
Elenco delle pagine di "Il linguaggio Java: lez.6"
Introduzione e Unità didattica 5.1) - Pagina 1
Introduzione e Unità didattica 5.2) - Pagina 2
Unità didattica 5.3) - Pagina 3
Unità didattica 5.4) - Pagina 4
Unità didattica 5.5) - Pagina 5
Unità didattica 5.6) - Pagina 6