








Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Java appunti slide sulle proprieta di programmazione ad oggetti
Tipologia: Appunti
1 / 14
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!









1
2
3
polimorfismo
polimorfismo : capacità di un oggetto di assumere forme molteplici
quale metodo è invocato?
la regola “is–a” à substitution principle
7
upcasting
se
variabile x è di tipo T
x =
x = (T)
T
E
x
downcasting
E
T
x
compatibilità di tipo e conversione
● cast verso l’alto – upcast - widening conversion
● cast verso il basso – downcast - narrowing conversion
9
upcasting
● la conversione upcasting fa sì che l' oggetto sottotipo sia trattato
esempio precedente
staff[0] = boss;
Manager
Employee
10
downcasting
● dato un riferimento a un supertipo, la conversione in un riferimento a un
sottotipo è conosciuto come una conversione di restrizione (narrowing
conversion/downcasting).
● Il downcast è un cast insicuro perchè a volte può non essere valido
accerti la fattibilità di questa conversion e la accetti
perchè l’oggetto effettivo a runtime potrebbe non avere le proprietà
specifiche della sottoclasse
Persona
Studente
Persona p; Studente s;
p = s; // ok: assign compatibility
s = p; //noooo! occorre downcasting esplicito
s = (Studente) p; // downcasing esplicito:
// java lo permette ma è pericoloso
p
s
nota: il contratto di s è più ampio di quello di p ma p potrebbe davvero essere un
oggetto Studente quindi usabile correttamente come tale tipo
13
polimorfismo
public class Persona {
protected String nome;
protected int anni;
public Persona(String n) {nome = n; anni = 0; }
public Persona(String n, int a) {nome=n; anni=a; }
public void print() {
System.out.print(“mi chiamo " + nome);
System.out.println(" e ho " + anni + "anni");
public class Studente
extends Persona {
protected int matr;
public Studente() {super(); matr = 9999; } //funziona??
public Studente(String n) { super(n); matr = 8888 ; }
public Studente(String n, int a) { super(n,a); matr=7777; }
public Studente(String n, int a, int m) {
super(n,a); matr=m; }
public void print() {
super.print(); System.out.println("Matricola = " + matr);}
Persona
Studente
@Override
Ridefinisce il metodo void print() sovrascrive quello ereditato
da Persona
di Persona (super), estendendolo per stampare la matricola
14
esempio: la classe SocialTest
public class SocialTest {
public static void main(String args[]){
Persona p = new Persona(”Giovanni”….);
Studente s = new Studente("Tommaso”…);
p.print(); // stampa nome, anni
s.print(); // stampa nome, anni, matricola
p=s; // OK (upcasting: Studente estende Persona)
p.print(); // COSA STAMPA ???
L’assegnamento p=s non comporta perdita di
informazione, perché si assegnano riferimenti (gli
oggetti puntati rimangono inalterati)
problema: cosa stampa?
Persona
un oggetto Studente
È un problema di POLIMORFISMO
15
polimorfismo
● Un metodo si dice polimorfo quando è in grado di adattare il suo
comportamento allo specifico oggetto su cui deve operare.
● In Java, la possibilità di usare riferimenti a una data classe - es., Persona
per puntare a oggetti di classi più specifiche – es. Studente
introduce in astratto la possibilità di avere polimorfismo.
Ma in pratica?
Java supporta il Polimorfismo
® prevale il tipo dell’oggetto
void print() è un metodo polimorfo è
poiché p referenzia uno Studente,
stampa nome, data di nascita, matricola cdl
OOP
16
early binding e late binding
19
…ma più classi possono derivare da una classe base comune
● Nella programmazione ad oggetti, il polimorfismo indica il fatto che lo stesso
codice eseguibile può essere utilizzato con istanze di classi diverse, aventi
una superclasse comune
● Il polimorfismo è particolarmente utile quando il linguaggio supporta il binding
dinamico (o late-binding):
oggetto effettivamente contenuto in una variabile a runtime
● non a compile time
● Se una variabile di tipo A ha due sottotipi (sottoclassi) B e C , che ridefiniscono
entrambe il metodo m() , l'oggetto contenuto nella variabile potrà essere di
tipo A , B o C , e quando sulla variabile viene invocato il metodo m() viene
eseguita la versione appropriata per il tipo di oggetto contenuto nella variabile
in quel momento.
●
A
La funzionalità binding
dinamico (o late-binding) è
supportata dai più diffusi
linguaggi di programmazione ad
oggetti.
esempio
class Animale {
public void verso () {
System.out.println(”sono un Animale"); }
class Pesce extends Animale {
public void verso() {
System.out.println(”glug glug");}
class Uccello extends Animale {
public void verso() {
System.out.println(”tweet tweet"); }
class Cane extends Animale {
public void verso() {
System.out.println(“woof woof"); }
public void ringhia() { System.out.println("Arf Arf"); }
tanto per dire che “un animale avrà un verso” L
non certo per scrivere un codice che valga nelle
varie classi derivate!!
21
public class Zoo {
public static void main (String[ ] argv) {
Animale[] animali = new Animale[3];
int index;
animali [0] = new Uccello( );
animali [1] = new Cane( );
animali [2] = new Pesce( );
for (Animale animale : animali)
animale.verso();
● La classe Animale ha verso() cosi ogni membro della classe può fare un
verso
● Output di un System.out.print…….
Polimorfismo e Dynamic Binding
Polimorfismo significa “assume molte forme”.. un riferimento a
una data classe può prendere la forma [oggetto concreto
riferito] di ognuna delle sue sottoclassi.
25
un esempio di utilizzo di downcasting
public class provaDownCasting{
public static void main(String[ ] argv) {
Animale[] zoo = new Animale[3];
zoo[0] = new Uccello( );
zoo[1] = new Cane( );
zoo[2] = new Pesce( );
for (Animale animale : zoo) {
animale.verso();
if (animale instanceof Cane){
Cane c = (Cane) animale;
c.ringhia();
La classe Animale ha verso() è ogni oggetto di zoo fa un verso
uso di instanceof
● Il Casting è usato qui per dare ad un oggetto di una sottoclasse la forma della
sottoclasse appropriata per consentire la chiamata del metodo;
infatti l’invocazione:
animale.ringhia ();
produce un errore perché un oggetto della classe Animali non ha il metodo
ringhia().
● Cosi, prima occorre eseguire il casting
if (animale instanceof Cane) {
Cane c = (Cane) animale;
c.ringhia();
● ma se Java può determinare cos’è o non è una dato oggetto attraverso di
instanceof, perché è necessario il cast?
Perche Java non fa questo per noi?
27
…
● Errori a Compiletime:
● Quelli che sono rilevabili senza che il programma sia un esecuzione
Employee e = new Manager(…);
e.getBonus(); // NOO!! il compilatore non accetta un downcasting implicito
Animale animale = new Animale(); // oppure new Uccello()…
animale.ringhia(); // NOO!! il il compilatore non accetta un downcasting
implicito
● Errori a Run-time:
● Quelli che sono riconoscibili solo durante l’esecuzione con i valori reali.
● Es.
Employee e = new Employee(…);
(Manager)e.getBonus() //NO: un Employee in genere non ha getBonus()
Animale animale = new Animale(); //oppure new Uccello()…
(Cane)animale.ringhia(); // NO: un Animale in genere non ha ringhia()