oop e java - unirc.it · corso di algoritmi e strutture dati programmazione object - oriented in...
TRANSCRIPT
Corso di Algoritmi e Strutture
dati
Programmazione Programmazione ObjectObject--
OrientedOriented in Javain Java
(Parte I)(Parte I)
Ing. Gianluca Caminiti
2
Sommario
� Programmazione Object-Oriented (OOP)
� Incapsulamento, Ereditarietà, Polimorfismo
� Richiami di base su Java
� Incapsulamento, Ereditarietà in Java
� Classi Astratte e Interfacce in Java
� Polimorfismo in Java
3
Programmazione Object-Oriented
� Paradigma di programmazione che mette al centro la
nozione di “oggetti”, raggruppati in “classi”.
� Una classe definisce un tipo di dati che rappresenta
una nozione (concreta o astratta della realtà).
� Ogni oggetto è definito da un insieme di dati
(attributi) e funzioni (metodi). Gli attributi ne
rappresentano lo stato, i metodi ne modellano il
comportamento.
4
Programmazione Object-Oriented
� Lo scopo principale dell’OOP è consentire il riuso
del codice attraverso la sua modularizzazione per
minimizzare la presenza di bug e accelerare i tempi
di sviluppo del software.
� Caratteristiche fondamentali dei linguaggi OOP:
� Incapsulamento
� Ereditarietà
� Polimorfismo
5
Incapsulamento
� Ogni oggetto contiene sia i propri dati che le funzioni che
operano su tali dati.
� L’accesso ai dati di un oggetto non può avvenire
direttamente, ma soltanto attraverso i metodi pubblici di
quell'oggetto. Questo risultato si ottiene usando i
qualificatori di accesso.
� Oggetti come “scatole nere”: non sono noti i dettagli di
funzionamento, ma solo l'interfaccia.
� E’ possibile cambiare l'implementazione di un oggetto senza
influenzare gli oggetti che da esso dipendono.
6
Ereditarietà
� Estensione di una classe “base” attraverso il riuso del codice della stessa in una classe “derivata” che la specializza.
� La classe derivata “eredita” (li vede come se fossero i suoi) attributi e metodi (non privati) della classe base. Relazione IS_A (Principio di Sostituzione).
� La classe derivata può ridefinire attributi/metodi della classe base o avere attributi/metodi aggiuntivi.
� L’ereditarietà può essere singola o multipla.
8
Polimorfismo
� Permette di avere metodi con la stessa signature che si comportano in modo differente a seconda degli oggetti su cui vengono invocati.
� Polimorfismo ed ereditarietà (subtyping): uso di metodi che accettano in input il super-tipo ma il cui comportamento si adatta ai sotto-tipi.
� Late binding – la scelta del metodo corretto avviene a run-time e non a compile-time (Virtual table o metadati).
9
Early/Late Binding
� Early Binding – Gli indirizzi dei metodi associati agli
oggetti sono conosciuti a compile-time. E’ il compilatore a
scegliere i metodo giusto fra i metodi candidati.
� Late binding – Gli indirizzi dei metodi associati agli oggetti
non sono noti a compile-time. La selezione del metodo
avviene a run-time (tramite Method Table o atre tecniche).
� Method Table – Ogni classe è associata ad una tabella che
gestisce le chiamate dei metodi che è possibile invocare per
quella classe. Ogni oggetto è associato alla tabella della
classe corrispondente.
10
Richiami di base su Java
� I tipi primitivi (numerici) come int, float, double, ecc. non sono “oggetti”. Per utilizzarli come tali esistono le classi “wrapper” Integer, ecc.
� Non esiste il concetto di puntatore, ma solo quello di riferimento. Tutte le variabili che contengono oggetti sono riferimenti, tranne quelle che contengono tipi primitivi.
� Non esiste il concetto di “distruttore” (per la presenza nella VM del Garbage Collector).
11
Richiami di base su Java
� Il passaggio di parametri è fissato:
� per valore (tipi primitivi)
� per riferimento (tipi oggetto)
� Le variabili locali devono essere inizializzate prima
di essere utilizzate.
� Gli attributi, se non inizializzati dal costruttore,
assumono il valore zero per i tipi numerici e null per
quelli di tipo riferimento a oggetto.
12
Incapsulamento in Java
� Qualificatori di accesso:
� public
� private
� protected (valido solo per attributi/metodi)
� package (per default)
� Per ciascun attributo/metodo si deve specificare un
qualificatore (non esistono le “sezioni” del C++).
13
Ereditarietà in Java
� Sintassi:
class Derivata extends Base
� Aggiunta/overriding di attributi/metodi
� Accesso ad attributi/metodi della classe Base:
� uso di super
� Ereditarietà “pubblica”: non è possibile ridurre l’accesso ad
attributi/metodi nella classe Derivata attraverso overriding.
� Solamente ereditarietà singola.
14
Ereditarietà in Java
� Esempio:
public class Studente extends Persona
� Studente può aggiungere attributi (es. matricola) o
metodi (es. get_matricola()).
� Studente può (deve) ridefinire metodi di Persona
(es. void print()).
15
Classi Astratte in Java
� Classi in cui alcuni metodi sono astratti (non sono implementati, c’è solo la signature).
� Sintassi:public abstract class FiguraGeometrica {
public abstract double perimetro();…}
� Non è possibile istanziare oggetti di una classe astratta. E’possibile dichiarare riferimenti di tipo “astratto”.
� Per istanziare oggetti è necessario derivare una classe che implementa tutti i metodi astratti.
16
Classi Astratte in Java
� Esempio:
public class Quadrato extends FiguraGeometrica {
public double perimetro()
{ return misuraLato*4;}
…}
� E’ possibile istanziare oggetti di Quadrato solo se tutti i
metodi astratti ereditati sono implementati.
� E’ possibile inizializzare un riferimento FiguraGeometrica
con un oggetto Quadrato (subtyping).
17
Interfacce in Java
� Simili alle classi astratte, ma possono contenere solo signature di metodi (pubblici) senza implementazione.
� Servono a “forzare” una classe a implementare un’insieme di metodi. I metodi sono pubblici per default.
� Sintassi:public interface FiguraGeometrica {
public double perimetro();…}
� Non è possibile istanziare oggetti di una interfaccia. E’possibile dichiarare riferimenti di tipo “interfaccia”.
18
Interfacce in Java
� E’ possibile istanziare oggetti di una classe che implementa
quell’interfaccia.
� Sintassi:
public class Quadrato implements FiguraGeometrica {
public double perimetro()
{ return misuraLato*4;}
…}
� Le interfacce permettono di realizzare un meccanismo
equivalente a quello dell‘ereditarietà multipla (usando
implements con più di una interfaccia alla volta).
19
Interfacce in Java
� E’ possibile:
FiguraGeometrica f = new Quadrato(6); ?
� E’ possibile:
Quadrato q = f;?
20
Interfacce in Java
� E’ possibile:
FiguraGeometrica f = new Quadrato(6); ? SI
� E’ possibile:
Quadrato q = f;? NO
Quadrato q = (Quadrato) f;
(si deve fare un casting � possibilità di eccezioni)
21
Polimorfismo in Java
� Il comportamento del programma varia in funzione
del tipo effettivo di un oggetto.
� Si può realizzare in tre modi:
� Usando le interfacce
� Usando le classi astratte
� Usando il subtyping
22
Polimorfismo (interfacce)
� Esempio:
array di elementi di tipo FiguraGeometrica e calcolo
del perimetro per ogni elemento.
� Ci sono due classi, Quadrato e Rettangolo, che
implementano l’interfaccia FiguraGeometrica.
� Se x è di tipo FiguraGeometrica, che cosa restituisce
x.perimetro()?
23
Polimorfismo (classi astratte)
� Esempio(idem):
array di elementi di tipo FiguraGeometrica e calcolo
del perimetro per ogni elemento.
� Ci sono due classi concrete, Quadrato e Rettangolo,
che estendono la classe astratta FiguraGeometrica.
� Se x è di tipo FiguraGeometrica, che cosa restituisce
x.perimetro()?
24
Polimorfismo (subtyping)
� Esempio:
public class Studente extends class Persona
…
� ho un array di oggetti di tipo Persona sui cui
elementi invoco un metodo void print()
� Cosa succede se scrivo:
Persona p = new Studente(“Mario”,“Rossi”, 46376);
p.print();
Corso di Algoritmi e Strutture
dati
Programmazione Programmazione ObjectObject--
OrientedOriented in Javain Java
(Parte II)(Parte II)
Ing. Gianluca Caminiti
28
Programmazione Generica
� Tecnica di programmazione per cui è possibile
realizzare strutture dati e algoritmi che funzionano
con diversi tipi di dati.
� In Java questo è possibile attraverso due tecniche:
� uso dell’ereditarità
� uso delle classi generiche
29
Genericità con Object
� E’ un’estensione del principio di sostituzione applicata al fatto che ogni classe Java è sottoclasse (diretta o indiretta) della classe Object.
� Si creano strutture dati che utilizzano tipi Object per permettere l’inclusione di tipi generici.
� Vantaggi:
� compatibilità col codice legacy (prima di Java 1.5.0)
� Svantaggi:
� non c’è controllo sui tipi a tempo di compilazione
� si deve usare il casting per recuperare il behaviour dell’oggetto di partenza
� si deve leggere il codice per capire il tipo effettivo utilizzato
30
Genericità con template
� Si usano dei “segnaposto” per rappresentare i tipi generici che sono usati nelle classi.
� Sintassi:public class nome_classe <T1, …>
� Vantaggi:
� Codice leggibile da chiunque
� Controllo a tempo di compilazione su violazioni di tipo
� Compatibilità col vecchio codice (tipi “raw”)
� Svantaggi:
� nessuno, al momento.