Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
OVERRIDING VS OVERLOADING
→i metodi overloaded sono a tutti gli effetti metodi diversi (hanno argomenti diversi).Hanno in comune solo il nome
→i metodi overridden sono definizioni di un metodo già esistente: tra loro esiste la relazione di mascheramento
OVERRIDING DI METODI
→più in generale l’overriding permette di ridefinire e specializzare metodi definiti in una superclasse 10
METODI SUPER
→nel caso di un metodo overriden è comunque possibile invocare il metodo nella versione della superclasse con la
sintassi super.nomeMetodo
→di solito è proprio il nuovo metodo a invocare quello da lui mascherato
→in caso contrario l’uso di super in assenza di una sua versione overriden fa nascere dubbi sulla correttezza del
progetto
→la parola chiave isolata serve per invocare il costruttore della classe padre da dentro il costruttore della
super()
classe figlia e deve essere la prima istruzione del costruttore
IL PROCESSO DI COSTRUZIONE
COSTRUZIONE DI UN’INSTANZA
→in virtù del meccanismo di ereditarietà, la costruzione di un'istanza di una classe non coinvolge solo la definizione
della classe stessa ma anche quella delle sue superclassi (almeno una c’è sempre:Object)
→pertanto quando si invoca il costruttore di una classe si scatena un processo che non si limita all’esecuzione del
codice del costruttore (che viene effettuata solo alla fine di tale processo)
→la costruzione è preceduta da:
- caricamento di tutte le superclassi
- inizializzazione dello loro variabili static
→la costruzione è costituita dalle fasi:
1. assegnazione dei valori di default agli attributi
2. chiamata al costruttore della classe base (quello di default oppure tramite si scatena
super):
la risalita nella gerarchia dei costruttori
3. esecuzione inizializzazione esplicite degli attributi
4. esecuzione del corpo del costruttore 11
12
POLIMORFISMO E LATE BIDING
SELEZIONE DEL METODO DA ESEGUIRE
→nel caso di metodi overloaded la selezione del metodo da eseguire è implicita nella chiamata e si fa al momento
della compilazione
→nel caso di metodi overriden la selezione dipende dall’oggetto al quale è riferita l’invocazione NON dal riferimento
attraverso il quale l’invocazione è veicolata
→per questo motivo la selezione deve venire effettuata durante l’esecuzione (late binding)
POLIMORFISMO
→Il polimorfismo permette di scrivere codice generico che si adatta automaticamente a tutte le specializzazioni di
una certa classe (anche quelle future)
→Il trucco è la selezione del metodo sulla base dell’oggetto durante l’esecuzione
→la generalità si paga con la perdita di efficienza 13
14
VANTAGGI DEL POLIMORFISMO:
- il polimorfismo permette di creare nuove classi derivate senza cambiare nulla nel codice delle classi che
usano le loro superclassi;
- RIUSO AUTOMATICO del codice di classi esterne + possibilità di utilizzare le nuove classi gratis
N.B. se l’impostazione è corretta si può cambiare/aggiungere molto lavorando poco.
COME BLOCCARE LA FILIAZIONE:
La parola chiave indica che è una definizione è definitiva
final
Per esempio:
- attributo = una costante
final
- metodo = non può avere overridden *
final
- classe = non può avere sottoclassi *
final
*servono ad aumentare l’efficienza: eliminano l’overhead legato al potenziale polimorfismo
Le classi e i sono
String, Math wrapper final.
CLASSI ASTRATTE
DAL POLIMORFISMO ALL’ASTRAZIONE:
→ le sottoclassi possono specializzare il comportamento di un metodo ereditato: in questo casi si suppone che il
metodo abbia un comportamento più generico definito in una superclasse.
- in alcuni casi il comportamento generico per il metodo non esiste: ha senso solo definire le sue varianti
specializzate. In questo caso nella superclasse il metodo ha il ruolo di segnaposto astratto per le implementazioni
nelle sottoclassi.
METODI ASTRATTI E CLASSI ASTRATTE:
→ un metodo astratto senza implementazione è preceduto dalla parola (nessuna implementazione!
abstract
diverso da implementazione vuota {}
→ una classe che contiene metodi astratti deve a sua volta essere definita come astratta
- le sottoclassi per poter essere istanziabili devono implementare i metodi astratti specificati
UNA CLASSE ASTRATTA UNA SUA CLASSE DERIVATA 15
UN’ALTRA SUA CLASSE DERIVATA UN’ALTRA ANCORA
IL CERCHIO SI CHIUDE
CLASSI ASTRATTE:
→ una classe può essere definita come astratta anche se non ha metodi astratti, però non può avere istanze
dirette ma solo sottoclassi
- variabili di una classe astratta sono ammesse e conterranno riferimenti a istanze di sottoclassi
INTERFACE
VERSO L’EREDITÀ MULTIPLA
→Java non ammette l’eredità multipla (da più classi) : per questo motivo è stato introdotto il concetto di interface
INTERFACE: - è una sorta di classe astratta ancora più astratta (classe astratta allo stato puro)
- una classe può implementare un numero arbitrario di interfacce (keyword: implements)
- la definizione è analoga a quella di una classe ma:
- gli attributi presenti (ma di solito non ci sono) sono implicitamente e
static final
(costanti)
- tutti i metodi sono implicitamente e
abstract friendly
- può essere o
public friendly 16
EREDITÀ MULTIPLA
→ l’assenza di aspetti implementativi ereditabili elimina i principali problemi legati all’eredità multipla
→ si stabilisce solo quali metodi bisogna ereditare, ma in nessun caso la loro codifica.
→ se una classe implementa un deve fornire un’implementazione per tutti i metodi da essa specificati
interface
EREDITÀ TRA INTERFACCE
→ una interfaccia può ereditare da un’altra (keyword e quindi aggiungere nuovi metodi per specializzarla
extends)
→ vale ovviamente la possibilità di eredità multipla tra interfacce
→ come una classe astratta, l’interfaccia non può avere istanze, però sono ammessi riferimenti a istanze di classi
che le implementano
USO DELLE INTERFACE
→ un nome di può comparire come tipo di una variabile, come tipo di argomento di un metodo, come
interface
tipo ritornato da un metodo.
UTILITÀ DELLE INTERFACCE
→ le permettono di specificare comportamenti standardizzati senza vincolare come essi vengono
interface
realizzati all’interno di una classe. Tali comportamenti permettono la combinazione flessibile di classi (una classe
può essere sostituita da un’altra se implementa la stessa interface.
→ in combinazione con il polimorfismo sono molto agevolati sia il riuso sia la modifica sia l’aggiunta di classi.
17
N.B. ESEMPIO A PAG 98 PPT “L’EREDITARIETà”
INTERFACE DA JAVA8: metodi statici
→Precedenti versioni di Java non permettevano l’uso di metodi statici nelle interface.
→Java8 lo permette:
- è una naturale estensione;
- non viola lo spirito dell’interface;
- sono parte dell’interfaccia e non possono essere sovrascritti nella classi che le implementano;
- l’uso di @Override con un metodo statico genera un errore di compilazione;
Bisogna usare il nome dell’interfaccia nella chiamata dei metodi.
Per esempio e non
Shape.sumAreas() sumAreas()
Metodi statici non possono modificare variabili statiche
INTERFACE DA JAVA8: metodi di default
→Java8 permette la definizioni di metodi di default (metodi concreti nelle interfacce)
→Avere un implementazione di default può essere molto comodo e permette di aggiungere comportamenti ad
interface esistenti senza rompere classi che implementano l’interface.
→una classe che implementa l’interfaccia erediterà il comportamento predefinito del metodo oppure lo potrà
sovrascrivere
→Metodi possono convivere con metodi astratti e metodi statici
default
→Ha problemi con ereditarietà multipla.
→Una classe può ereditare metodi predefiniti da più interfacce e questi possono entrare in conflitto:
- le classi vincono: succede quando una classe estende un’altra ed implementa un'interfaccia,
ereditando lo stesso metodo da entrambe;
- le interfacce rimangono in conflitto: quando una classe implementa due interfacce che hanno
lo stesso metodo predefinito; la sua sovrascrittura nella classe è obbligatoria 18
LE CLASSI INTERNE
→una classe definita all’interno di un’altra classe o di un metodo, viene detta classe interna (inner class)
→se una classe viene definita all’interno di un’altra classe ma al di fuori dei metodi, allora tale classe sarà visibile a
tutti i metodi della classe che la contiene
aggiungi le ultime pagine 19
10. ECCEZIONI
ECCEZIONI
→ci possono essere svariati errori che si possono verificare in esecuzione.
GESTIONE DELLE ECCEZIONI
→ECCEZIONI: situazione che impedisce la regolare continuazione del programma.
→le eccezioni devono essere gestite -> la gestione delle eccezioni è distinta dal codice per il funzionamento
normale
→N.B.: la gestione di un’eccezione può avvenire in un punto diverso da quello dove l’eccezione si verifica
LA CATTURA DELLE ECCEZIONI
→l’esecuzione di certe istruzioni può generare (in gergo “lanciare”) eccezioni.
→un’eccezione generate è in realtà un oggetto appartenente ad una certa classe che viene creato a seguito del
verificarsi di un’anomalia.
- questo oggetto contiene informazioni su cosa è successo e viene “catturato” e utilizzato dal
codice per la gestione delle eccezioni
SCOPI DELLA GESTIONE ECCEZIONI
→1. evitare numerosi controlli sparpagliati e ripetuti, concentrandosi in sezioni di codice apposite
2. tenere distinti codice normale e codice di gestione anomalie
3. invogliare (o obbligare) a tener conto delle anomalie in modo appropriato
TRY-CATCH
DA JAVA 7:catch multiplo
→è possibile catturare eccezioni di più classi nello stesso blocco catch 20
GESTIONE ECCEZIONE INPUT
→i metodi della classe possono dar luogo a tre tipi di eccezione:
nextQualcosa Scanner
se il dato non è nel formato appropriato
- inputMismatchExpetion se non ci sono dati →difficilmente può succedere per
- noSuchElementExcpetion
un’instanza associata alla tastiera
se l'istanza di Scanner non è in grado di fornire dati(il suo stato non
- IllegalStateExpetion
è attivo) →difficilmente può