Sei sulla pagina 1di 6

IL LINGUAGGIO JAVA Dispense per il corso di laboratorio di sistemi I.T.I.S. ABACUS A.S.

S. 2008/2009 Autore: Roberto Amadini Testo di riferimento: La programmazione ad oggetti C++ Java (Lorenzi, Moriggia, Rizzi ATLAS)

1.
1.1

I FONDAMENTI DELLA PROGRAMMAZIONE AD OGGETTI


Introduzione
Il mondo in cui viviamo molto complesso Bisogna saper gestire e controllare la complessit degli oggetti che lo compongono. Ci avviene mediante un opportuna ASTRAZIONE della realt (oggetti reali): L astrazione (o modellazione) un procedimento che consente di semplificare la realt che si sta analizzando, mediante opportune tecniche che permettono di considerare tutti e soli gli aspetti rilevanti di tale realt, evitando di prendere in considerazione dettagli inutili. Il risultato (output) del processo di astrazione la creazione di un MODELLO, ossia una rappresentazione semplificata della realt in esame.

PROBLEMA REALE p Esempi:

ASTRAZIONE DI p

MODELLO DI p

Rappresentazione delle vie di una citt piantina stradale Rappresentazione del profitto di un alunno pagella

Lastrazione svolge un ruolo fondamentale nellInformatica; la risoluzione di problemi infatti avviene sempre per mezzo di astrazioni pi o meno evidenti, mediante lutilizzo di programmi sviluppati secondo diversi paradigmi di programmazione. Per PARADIGMA DI PROGRAMMAZIONE si intende la modalit concettuale attraverso la quale il programmatore analizza, modella e risolve un dato problema. Ogni linguaggio di programmazione generalmente ispirato (o riconducibile) ad un certo paradigma; i principali paradigmi di programmazione sono: Imperativo: Il problema viene risolto mediante una sequenza ordinata di passi (algoritmo). Loperazione principale quella di assegnamento (es. x = 7) e lordine di esecuzione delle istruzioni fondamentale (es. x = 7; x++; x *= 3; in C++ ha una semantica ben diversa da x = 7; x *= 3; x++). Un paradigma di questo tipo quindi orientato allalgoritmo, cio a come (how) il programma deve risolvere un dato problema. Esempi di linguaggi di programmazione imperativi sono ad esempio Fortran, Pascal, C. Dichiarativo: Questo paradigma invece orientato al problema, cio a cosa (what) il programma deve fare per risolvere un dato problema. I linguaggi di programmazione dichiarativa si dividono principalmente in logici (basati sulla logica

matematica, es. Prolog) e funzionali (basati sul concetto di funzione matematica, es. Lisp, Haskell). Un linguaggio dichiarativo molto diffuso per la manipolazione di basi di dati lSQL. ORIENTATO AGLI OGGETTI: Il problema da risolvere viene analizzato e modellato secondo un opportuno SISTEMA DI OGGETTI che comunicano tra loro scambiandosi messaggi. In generale, un SISTEMA una realt costituita da elementi eterogenei caratterizzati da propriet (attributi rilevanti) e azioni (relazioni fra componenti). Un OGGETTO si pu invece vedere come un entit caratterizzata da un proprio stato (insieme di valori che loggetto assume ad un certo istante di tempo) e da una propria algebra (insieme di operazioni che possibile eseguire su tale oggetto). Questo paradigma sta alla base dei linguaggi di programmazione orientati agli oggetti (OOP, Object Oriented Programming). I linguaggi OO sono quindi un evoluzione dei linguaggi ad alto livello imperativi (Pascal, C) che, anzich essere orientati allalgoritmo, sono orientati al concetto di sistema di oggetti, cio sistemi i cui componenti fondamentali sono proprio gli oggetti.

1.2

Programmazione Orientata agli Oggetti (OOP)

Lorientamento agli oggetti si sviluppato a partire dagli anni 70 partendo dal concetto di sistema. Questo approccio al problema, grazie ai suoi vantaggi, si sviluppato fino ai giorni nostri toccando anche altri settori dellinformatica quali ad esempio la gestione di database e lingegneria del software. Il processo di astrazione consiste in un ANALISI dettagliata del problema reale, che produce un MODELLO del sistema, composto dagli oggetti e dalle relazioni che intercorrono tra essi. Tale modello non entra nei dettagli implementativi (cio, non dice come deve essere implementato) ma si ferma ad un livello di astrazione pi alto (cio, indica solamente cosa deve fare il programma). In realt, non possibile parlare di oggetti senza prima aver introdotto il concetto di CLASSE: Una classe un TIPO DI DATO ASTRATTO (ADT, Abstract Data Type) cio un entit caratterizzata da un dominio di valori (cio, un insieme di possibili valori che lentit pu assumere) e da un algebra su tale dominio (cio, un insieme di operazioni possibili su tale insieme). Ad esempio, sono ADT anche i tipi primitivi dei linguaggi di programmazione tradizionali (ad es. il tipo int in C++ ha come dominio linsieme degli interi compresi tra -32768 e 32767 e come operazioni possibili +, -, *, /, % ecc). In una classe il dominio composto da tutti gli ATTRIBUTI (cio, tutte le propriet che caratterizzano la classe) mentre le operazioni sugli attributi possono essere effettuate dallutente mediante linvocazione di appositi METODI della classe (cio, lutente richiama apposite funzioni proprie di quella classe). A questo punto, posso definire un OGGETTO obj DI UNA CERTA CLASSE C come un ISTANZA (cio, un membro, un rappresentante) di tale classe C. Ovviamente, obj erediter tutti gli attributi ed i metodi della classe C. Il valore assunto dagli attributi di obj ne definir lo stato. I metodi di obj corrisponderanno alle operazioni possibili sulloggetto (ad es. potr invocare metodi di obj per leggere o modificare i suoi attributi).

Esempio: lautomobile Supponiamo di voler modellare un sistema di automobili. Il componente principale (classe) sar quindi lautomobile. Quale sar il suo dominio? Cio quali saranno i suoi attributi? Ad esempio, alcune caratteristiche standard per ogni automobile sono: Costruttore Modello Colore Potenza Cilindrata Ecc

Tali propriet saranno quindi attributi della classe Automobile. Individuiamo ora i comportamenti, cio le operazioni che possibile effettuare con una generica automobile: Avvio Accelera / Decelera Fermati Gira a destra / sinistra Ecc

Tali azioni saranno quindi metodi della classe Automobile. E gli oggetti? A cosa corrisponderanno? Per definizione, un oggetto unistanza di una certa classe, per cui un oggetto della classe Automobile corrisponder ad un rappresentante di tale classe, caratterizzato da un proprio stato (i valori di colore, modello, potenza ecc) e da un insieme di operazioni possibili sulloggetto (tutti i metodi della classe Automobile: avvio, accelerazione ecc) Ad es., potrei definire un oggetto miaMacchina di classe Automobile con i seguenti attributi: Costruttore = Peugeot Modello = 206 Colore = Grigio Fer Potenza = 75 Cilindrata = 1360

Una volta definito tale oggetto potrei quindi utilizzarne i metodi per avviare lautomobile, rallentare, scalare marcia ecc Inoltre, possibile creare un numero indefinito di oggetti della classe Automobile; viceversa non possibile definire un oggetto senza aver prima creato una classe, in quanto un oggetto si riferisce sempre ad una certa classe. Posso ad esempio creare un altro oggetto di classe Automobile: macchinaDeiMieiGenitori: Costruttore = Ford Modello = Escort Colore = Nero Ecc

1.3

Principali caratteristiche dellOOP

1. INCAPSULAMENTO: Possibilit di incorporare in un oggetto sia dati (attributi) che funzioni (metodi). Ad es. la stessa entit miaAutomobile racchiude sia le caratteristiche tecniche delloggetto sia le funzioni per poterlo utilizzare. 2. INFORMATION HIDING: Possibilit di nascondere le informazioni non necessarie allutente. Ad esempio, richiamando il metodo avvia lutente potr avviare la macchina senza che egli sappia quale meccanismo stia realmente dietro allavvio dellautomobile (allutente non interessano le fasi del motore a quattro tempi, basta che la macchina parta). Strettamente legato allInformation Hiding il problema dellACCESSO AGLI ATTRIBUTI di una classe: non tutti gli attributi di una classe possono essere acceduti dallutente esterno. Ad es. per ogni automobile si vuole tenere segreto un particolare attributo che tenga traccia del numero di riparazioni effettuate in modo che esso sia invisibile allutente. Stesso discorso per i metodi: ad es. potrebbe esserci un metodo raffreddamento richiamato dallautomobile stessa qualora la temperatura del motore risulti troppo elevata; tale azione per non deve essere intrapresa dallutente bens dalloggetto in modo invisibile allutente. Per distinguere ci che un oggetto vuole mostrare allesterno da ci che invece vuole tenere nascosto si utilizzano una sezione pubblica (contenente attributi e metodi utilizzabili dallesterno) ed una sezione privata (contenente attributi e metodi invisibili allutente esterno).

3. EREDITARIETA: Si riferisce alla capacit di creare, a partire da una certa classe C, un qualsiasi numero di SOTTOCLASSI o CLASSI FIGLIE di C (che quindi diventer classe PADRE o SOVRACLASSE delle sue classi figlie). Tali relazioni tra classi inducono naturalmente una GERARCHIA di classi, cio un ordinamento delle classi (strict weak ordering). Ad esempio: A, B, C, D, E sono classi qualsiasi. La freccia da una qualsiasi classe X ad una qualsiasi altra classe Y sta ad indicare che X sottoclasse di Y. In questo caso, B e C sono sottoclassi di A; D sottoclasse di B e C; E sottoclasse di B. Ma E sottoclasse di A? Stesso discorso per D Certo, perch questa relazione gode della propriet transitiva: potremmo dire che A classe nonna di E e D, D ha due padri B e C (che sono tra loro fratelli).

E D

Lereditariet un concetto fondamentale dellOOP; noi ci limiteremo solamente a considerare lereditariet PUBBLICA e SINGOLA, cio: PUBBLICA: Ogni sottoclasse C1, C2, , Cn di una certa classe C eredita tutti i metodi e gli attributi pubblici di C, che pu utilizzare per i propri scopi. SINGOLA: Ogni sottoclasse pu avere al massimo una classe padre (nellesempio precedente D non usa lereditariet singola, perch eredita sia da B che da C)

NOTA: La relazione di ereditariet tra una classe figlia F ed una classe padre P detta anche relazione ISA (da IS A, cio un). Infatti F eredita tutti gli attributi ed i metodi di P, quindi in un certo senso F un P, con opportune modifiche e/o specializzazioni. Esempio: Sia i MezziAMotore che i MezziNonAMotore sono (ISA) MezziDiTrasporto. LAutomobile e la Moto sono MezziAMotore (e quindi anche MezziDiTrasporto) ma non sono MezziNonAMotore. La Bicicletta fa parte dei MezziNonAMotore (e quindi anche dei MezziDiTrasporto) ma non dei MezziAMotore.

MezziDiTrasporto

MezziAMotore

MezziNonAMotore

Automobile

Moto

Bicicletta

QUANDO SI USA LEREDITARIETA? In generale, lereditariet consente ad una certa sottoclasse di utilizzare le caratteristiche (attributi e metodi) della classe padre da cui eredita. Come si differenzia quindi la sottoclasse dalla classe padre? Principalmente in tre modi: Per ESTENSIONE: la sottoclasse aggiunge nuovi attributi e/o metodi che si sommano a quelli ereditati dalla classe padre, in modo che lutente possa avere a disposizione un insieme di funzionalit esteso alle proprie necessit. Ad es., nella classe Automobile potrei aggiungere un metodo accendiTergicristalli che proprio dellauto e non dei mezzi a motore in generale (la moto non ha tergicristalli). Per RESTRIZIONE: la sottoclasse restringe alcuni attributi e/o metodi della padre, cio inibisce il loro utilizzo in modo che lutente abbia a disposizione solamente gli attributi ed i metodi dei quali necessita realmente. Ad es., se il metodo accendiTergicristalli fosse presente nella classe MezziAMotore, nella classe Moto dovrei inibirlo in quanto la moto non presenta tale funzionalit. Per SPECIALIZZAZIONE: Simile allestensione; in questo caso per non aggiungo nuove funzionalit ma ridefinisco (o sovrascrivo, overriding) alcuni (o tutti) i metodi ereditati dalla classe padre. Tali metodi vengono quindi specializzati dalla sottoclasse in base al loro utilizzo. Ad es., supponiamo che la classe MezziDiTrasporto presenti un metodo avvia. Tale metodo dovrebbe essere ridefinito per le classi Automobile, Moto e Bicicletta in base al tipo di avvio del mezzo di trasporto (per avviare una macchina non spingo sui pedali). I linguaggi OO permettono quindi la definizione di CLASSI ASTRATTE, cio classi interfaccia che non possono generare oggetti in quanto almeno uno dei suoi metodi non implementato. Sar quindi compito delle sue sottoclassi implementare (cio, specializzare) tali metodi lasciati indefiniti.

POLIMORFISMO: Si riferisce alla capacit di uno stesso metodo di assumere pi forme, cio la possibilit di avere un interfaccia comune per attivit strettamente correlate. Si suddivide in: DINAMICO: realizzato con il meccanismo dellereditariet e delloverriding di metodi; ad es. il metodo avvia polimorfo in quanto pur avendo la stessa interfaccia (lo stesso nome) specializzato in modo differente da auto, biciclette, moto a seconda delle caratteristiche della sottoclasse che lo ridefinisce. Si dice dinamico perch il processo di associazione tra loggetto che invoca il metodo ridefinito ed il metodo stesso avviene a tempo di esecuzione (run-time). In questo caso si parla anche di late binding. STATICO: un metodo con la stessa interfaccia (stesso nome) pu essere sovraccaricato (overload) cio differenziarsi per numero e tipo degli argomenti. Ad esempio per un Automobile potrei avere un metodo cambiaMarcia() che di default mette una marcia in pi, ma potrei anche avere un metodo cambiaMarcia(n) che cambia n marce alla volta (es. n = -1 scalo di una marcia, n = 0 metto in folle, n = 1 metto una marcia in pi ecc). Si dice statico perch il processo di associazione tra loggetto che invoca il metodo ridefinito ed il metodo stesso avviene a tempo di compilazione (compile-time).

1.4

I linguaggi orientati agli oggetti (Object Oriented)

Un linguaggio orientato agli oggetti se fornisce costrutti per gestire le principali caratteristiche del paradigma OOP: oggetti, classi, ereditariet, polimorfismo. Si dividono in linguaggi OO puri (ogni entit un oggetto, ad esempio Smalltalk e Eiffel) e ibridi (esistono entit che non sono oggetti, come ad es. i tipi primitivi int, char, float ecc). Un linguaggio ibrido meno formale e rigoroso, ma permette maggiore elasticit ed efficienza. I pi importanti linguaggi OO ibridi ad oggi sono C++ e Java; in particolare noi ci soffermeremo sulle caratteristiche principali di questultimo. Si osservi tuttavia che spesso Java viene considerato linguaggio puro, in quanto gli oggetti costituiscono la base del linguaggio mentre i tipi primitivi solamente una parte marginale.