oop e java - unirc.it · corso di algoritmi e strutture dati programmazione object - oriented in...

31
Corso di Algoritmi e Strutture dati Programmazione Programmazione Object Object - - Oriented Oriented in Java in Java (Parte I) (Parte I) Ing. Gianluca Caminiti

Upload: hanga

Post on 15-Feb-2019

217 views

Category:

Documents


0 download

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.

7

Ereditarietà

Mezzo di Trasporto

Automobile

Studente

Studente-Lavoratore

Lavoratore

StationWagon

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();

Riferimenti

� Cay Hortstmann, Concetti di Informatica e

fondamenti di Java, Apogeo.

Corso di Algoritmi e Strutture

dati

Programmazione Programmazione ObjectObject--

OrientedOriented in Javain Java

(Parte II)(Parte II)

Ing. Gianluca Caminiti

27

Sommario

� Programmazione Generica

� Genericità con la classe Object

� Genericità con i template

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.

Riferimenti

� Cay Hortstmann, Concetti di Informatica e

fondamenti di Java, Apogeo.