Ereditarietà ed interfacce in Java
Paolo Bison
Fondamenti di Informatica 1 A.A. 2004/05
Universit`a di Padova
Ereditarietà
definizione di una classe (sottoclasse) come estensione di un altra classe (superclasse)
gerarchia di classi (albero/grafo di ereditarietà)
una sottoclasse può:
definire nuove variabili e/o metodi
ridefinire variabili e/o metodi presenti nelle superclassi
Ereditariet`a ed interfacce in Java, Paolo Bison, A.A. 2004-05, 2004-11-13 – p.2/18
Ereditarietà in Java
singola
albero di ereditarietà +
interfacce
emulazione ereditarietà multipla
Sottoclasse
clausola opzionale extends in dichiarazione di classe class <classId> [extends <classId> ]
Es.: class Complex extends Number { ...}
classe Object
superclasse di default se non c’è clausola extends class Number { ...}
Ereditariet`a ed interfacce in Java, Paolo Bison, A.A. 2004-05, 2004-11-13 – p.4/18
Associazione degli identificatori
associazione tra un identificatore e la sua dichiarazione
dato un identificatore si vede se è dichiarato nella classe
se non è lì dichiarato, si guarda nella superclasse
se non è dichiarato nella superclasse, si guarda nella superclasse della superclasse
altrimenti nella superclasse della superclasse della superclasse e così via ...
si risale la gerarchia di ereditarietà finchè non si trova
la dichiarazione o si segnala errore.
Ridefinizione di metodi
dato un metodo nella superclasse vi sono due possibilità:
“overloading”
definirlo con una differente “signature” (stesso nome, ma parametri differenti)
“overriding”
definirlo con la stessa “signature” (stesso nome e stessi parametri)
Ereditariet`a ed interfacce in Java, Paolo Bison, A.A. 2004-05, 2004-11-13 – p.6/18
Ridefinizione di variabili
ridichiarare una variabile nasconde la definizione data nella superclasse
la variabile della superclasse non è accessibile
direttamente nella sottoclasse
Pseudo variabile super
riferimento all’oggetto corrente come istanza della superclasse
utilizzabile solamente nei metodi non-statici
meccanismo per accedere ad elementi della superclasse:
super.
metodoattiva il
metodopresente nella superclasse
super.
varaccede alla variabile
varpresente nella superclasse
Ereditariet`a ed interfacce in Java, Paolo Bison, A.A. 2004-05, 2004-11-13 – p.8/18
Costruttori
attivazione esplicita di un costruttore della superclasse con il costrutto:
super([<parametri>])
deve essere la prima istruzione del costruttore
se non è presente il sistema invoca implicitamente super()
attivazione esplicita di un costruttore della stessa classe con il costrutto:
this([<parametri>])
Conversione di tipo
implicita
da una classe ad una qualunque delle sue superclassi Complex c; Number n; Object o;
n=c; o=c;
esplicita
da una classe ad una delle sue sottoclassi se e solo se l’oggetto è istanza della sottoclasse
c=(Complex)n;
Ereditariet`a ed interfacce in Java, Paolo Bison, A.A. 2004-05, 2004-11-13 – p.10/18
Opzione final
elementi dichiarati final hanno le seguenti proprietà:
classe
non può essere estesa
metodo
non può essere “overriden”
variabile
non si può modificare il valore (costanti)
Classi astratte
classi che non possono avere istanze
descrivono parti condivise tra più classi
opzione abstract in intestazione della classe
Ereditariet`a ed interfacce in Java, Paolo Bison, A.A. 2004-05, 2004-11-13 – p.12/18
Interfaccia
definizione di un tipo
sintassi
interface <Id>
[extends <interfaceIdList> ] {
<constantDefs>
<methodDefs>
}
consiste di costanti e metodi astratti
non vi è l’implementazione dei metodi che è demandata alle classi
grafo di ereditarietà delle interfacce
Interfaccia IntForwardList
definisce i metodi per accedere in avanti ad una lista di interi
interface IntForwardList {
int first();
int next();
boolean endOfList();
}
Ereditariet`a ed interfacce in Java, Paolo Bison, A.A. 2004-05, 2004-11-13 – p.14/18
Interfaccia IntBackwardList
definisce i metodi per accedere all’indietro ad una lista di interi
interface IntBackwardList {
int last();
int previous();
boolean beginOfList();
}
Interfaccia IntBackforthList
definisce i metodi per accedere in entrambe le direzioni ad una lista di interi
composizione di funzionalità
interface IntBackforthList
extends IntForwardList,IntBackwardList {
}
Ereditariet`a ed interfacce in Java, Paolo Bison, A.A. 2004-05, 2004-11-13 – p.16/18
Implementazione
classe definisce quali interfacce implementa
clausola implements in intestazione di classe
class <classId> [extends <classId> ] [implements <interfaceIdList> ] { ...}
la classe deve implementare tutti i metodi definiti nelle interfacce presenti in <interfaceIdList>
tipo polimorfico
istanze appartengono sia al tipo <classId> che ai tipi
definiti dalle interfacce
Conflitto tra identificatori
medesimo identificatore di metodo utilizzato in più di una interfaccia
differente “signature”
si implementano tutti i metodi corrispondenti
stessa “signature”
si implementa un solo metodo se hanno tutti il medesimo “return type” altrimenti interfacce incompatibili
Ereditariet`a ed interfacce in Java, Paolo Bison, A.A. 2004-05, 2004-11-13 – p.18/18