Laboratorio di programmazione
Java
Derivazione
tra classi
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Classe D derivata da B
 class B {
//CLASSE BASE
int x;
void G() { x = x * 20; }
}
 class D extends B {
//CLASSE DERIVATA
void H() { x = x * 10; }
}
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Principi fondamentali della
derivazione – Principio 1
 Tutte le proprietà definite
per la classe base vengono
implicitamente definite anche
nella classe derivata …
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Principi fondamentali della
derivazione – Principio 1
 … cioè vengono ereditate da
quest’ultima.
 Ad esempio la classe D ha il
campo dati int x; e la funzione
void G();
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Principi fondamentali della
derivazione – Principio 2
 La classe derivata può avere
ulteriori proprietà …
 Ad esempio la classe D ha in più,
rispetto alla classe base B, la
funzione void H();
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Principi fondamentali della
derivazione – Principio 3
 Ogni oggetto della classe derivata
è anche un oggetto della classe
base …
 … cioè si può usare un oggetto
della classe derivata in ogni
situazione/contesto in cui si può
usare un oggetto della classe base
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Principi fondamentali della
derivazione – Principio 3
 static void stampa(B bb) {
System.out.println(bb.x);
} …
D d = new D();
d.G();
//OK
stampa(d); //OK
 … la classe D è compatibile con
la classe B.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Principi fondamentali della
derivazione – Principio 4
 Non è vero che un oggetto della
classe base è anche un oggetto
della classe derivata …
 … non è possibile usare un
oggetto della classe base laddove
si può usare un oggetto della
classe derivata.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Principi fondamentali della
derivazione – Principio 4
 B b = new B();
b.H();
//NO: non ha il campo H()
D d = b;
//NO: B non è compatibile con D
b = new D();
//OK D è compatibile con B
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Gerarchie di classi:
in profondità
 Una classe derivata può fungere
da classe base per ulteriori
derivazioni …
 class B {…}
class D extends B {…}
class E extends D {…}
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Gerarchie di classi:
in ampiezza
 Una classe può avere un numero
qualsiasi di classi derivate …
 class B {…}
class D extends B {…}
class Dbis extends B {…}
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Gerarchie di classi: esempio
C
D
Dbis
E
 Ogni classe ha solo una classe base…
 …no ereditarietà multipla in Java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Casting
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Riferimenti di diverse classi
possono denotare lo stesso oggetto
 class B {…}
class D extends B { int x_d; }
…
D d = new D();
d.x_d = 10;
B b = d;
//OK b e d denotano lo stesso ogg.
b.x_d = 20;
//NO x_d non è un campo di B!
//type checking statico
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Casting per accedere ai campi
della classe derivata
 class B {…}
class D extends B { int x_d; }
…
D d = new D();
d.x_d = 10;
B b = d;
//OK b e d denotano lo stesso ogg.
((D)b).x_d = 20;
//OK (D)b è un riferimento di tipo D
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Il casting tra classi lungo lo stesso
cammino in una gerarchia di
derivazione è …
 … sempre sintatticamente
corretto (non vengono mai
rivelati errori di compilazione) …
 … ma è responsabilità del
programmatore che sia anche
semanticamente corretto …
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempio
 class B {…}
class D extends B { int x_d; }
…
B b = new B();
D d = (D)b;
//OK a tempo di compilazione, ma …
//NO a runtime (ClassCastException)
d.x_d = 10;
//NOTA: x_d non esiste nell’oggetto
//denotato da d!
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Livello di accesso
protected
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
 Una classe D derivata da un’altra
classe B, anche se in un package
diverso, ha una relazione speciale
con quest’ultima…
 …non è un cliente qualsiasi di B
in quanto vogliamo poter usare
oggetti di D al posto dei quelli di B…
 …non coincide con B.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
 Per questo motivo può essere che B
voglia mettere a disposizione di D
dei campi che non sono a
disposizione di clienti generici di B
 …per fare ciò si dicharano detti
campi protected…
 …garantendo l’accesso ad essi alle
classi derivate, ma bloccandone
l’accesso ai clienti generici.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Costruttori delle
classi derivate
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
 Anche gli oggetti delle classi
derivate sono creati chiamando un
costruttore…
 …tale costruttore però deve
inizializzare anche i campi dati
ereditati…
 … alcuni dei quali sono
inaccessibili dalla classe derivata
(es. private)…
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
 …per fare ciò Java richiede
di invocare un costruttore della
classe base nei costruttori della
classe derivata…
 …mediante il costrutto super()
che deve essere la prima
istruzione eseguibile del corpo del
costruttore della classe derivata.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempio
EsempioCostuttori1.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Qualora un costruttore della classe
derivata non contiene l’invocazione
esplicita di un costruttore …
 …viene invocato automaticamente
il costruttore senza parametri…
 …se quest’ultimo non è presente
viene generato un errore.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempio
EsempioCostuttori2.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Se una classe derivata non
contiene costruttori …
 …Java ne fornisce
automaticamente un costruttore
standard senza parametri…
 …che invoca il costruttore senza
parametri della classe base...
 …e lascia i campi dati della classe
derivata al loro valore di default.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempio
EsempioCostuttori3.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Costrutto this()
 …da utilizzare in modo analogo
a super()…
 …è un’invocazione esplicita ad
un altro costruttore della stessa
classe…
 …permette si riusare codice già
scritto…
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempio
PersonaThis.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Principi fondamentali della
derivazione

Principio 1: la classe derivata eredita
le proprietà (campi) della classe base

Principio 2: può avere ultriori
proprietà

Principo 3: è compatibile con la classe
base

Principio 4: ma non il viceversa
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”