Buono sconto 4% su Toner e Cartucce agli utenti AZpoint. SU Iomiricarico.it!!
- 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:
class Arte
{
. . .
}
il compilatore in realtà "scriverà" questa classe nel seguente modo:
class Arte extends Object
{
. . .
}
|