Introduzione a Classi e Oggetti



Похожие документы
Livelli di astrazione

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Oggetti Lezione 3. aspetti generali e definizione di classi I

Funzioni in C. Violetta Lonati

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Inizializzazione, Assegnamento e Distruzione di Classi

Programmazione ad oggetti

Visibilità dei Membri di una Classe

Concetto di Funzione e Procedura METODI in Java

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Fasi di creazione di un programma

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Java: Compilatore e Interprete

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Object Oriented Programming

La struttura dati ad albero binario

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Esercizio: gestione di un conto corrente

costruttori e distruttori

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Classi ed Oggetti in JAVA

Parola chiave extends

Esercitazione n 4. Obiettivi

Programmazione a Oggetti Lezione 10. Ereditarieta

Realizzazione di una classe con un associazione

Corso di Informatica


Introduzione alla programmazione in C

Soluzione dell esercizio del 2 Febbraio 2004

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Testo Esercizio. Un modello è ragionevole quando contiene queste tre caratteristiche.

Informatica. Prof. A. Longheu. Introduzione ai Linguaggi Object-Oriented

dall argomento argomento della malloc()

Esercizio data base "Biblioteca"

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Introduzione alla Programmazione Orientata agli Oggetti. Classi, Oggetti e Messaggi

Programmazione in Java Parte I: Fondamenti

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

Modulo 4: Ereditarietà, interfacce e clonazione

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Prova di Laboratorio di Programmazione

Algoritmi di Ricerca. Esempi di programmi Java

Leggere un messaggio. Copyright 2009 Apogeo

UML Diagrammi delle classi. UML Diagramma classi 1

Corso di Informatica

Database 1 biblioteca universitaria. Testo del quesito

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Eredità in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione a Oggetti Modulo B

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Test di unità con JUnit4

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Grafico della parabola

GESTIONE DEI PROCESSI

TECNICHE DI SIMULAZIONE

esercizi Esercizi / problemi

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Progettaz. e sviluppo Data Base

Organizzazione degli archivi

Liberare la memoria allocata dinamicamente.

Laboratorio di programmazione

Java? Sì, grazie. Scopo del corso

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Strutturazione logica dei dati: i file

Manuale Utente Albo Pretorio GA

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

Programmazione Java: Variabili membro, Metodi La parola chiave final

Esercizi della lezione 5 di Java

Architettura MVC-2: i JavaBeans

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Il tipo di dato astratto Pila

Struttura di un programma Java

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

GUIDA ALL UTILIZZO DI MF QUICKEN

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Object Oriented Software Design

Tipi di Dato Ricorsivi

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

Il software ideale per la gestione delle prenotazioni GUIDA UTENTE

Outline. Programmazione ad oggetti in Java. La programmazione ad oggetti Classi e istanze Associazioni fra classi Incapsulamento Costruttori

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

Introduzione al Linguaggio C

EXCEL PER WINDOWS95. sfruttare le potenzialità di calcolo dei personal computer. Essi si basano su un area di lavoro, detta foglio di lavoro,

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Introduzione. Alberto Fortunato Pag. 1 di 137

Comunicazione tra Computer. Protocolli. Astrazione di Sottosistema di Comunicazione. Modello di un Sottosistema di Comunicazione

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Esercizio sui data base "Gestione conti correnti"

Транскрипт:

Introduzione a Classi e Oggetti Oggetto: concetto astratto Entità di un programma dotata di tre proprietà caratteristiche stato informazioni conservate nell oggetto condizionano il comportamento dell oggetto nel futuro può variare nel tempo per effetto di un operazione sull oggetto Es. casella vocale: vuoto = nessun messaggio pieno = elevato # messaggi accetta un messaggio se e solo se non piena comportamento definito dalle operazioni che possono essere eseguite dall oggetto (metodi) e che possono modificare lo stato dell oggetto Es. casella vocale: aggiungere un messaggio ad un elenco recuperare un messaggio memorizzato identità ogni oggetto ha una propria identità Es. casella vocale: due caselle con gli stessi messaggi sono pur sempre distinguibili

Classe: concetto astratto Ogni oggetto appartiene a (è un istanza di) una classe che ne determina il tipo Una classe descrive un insieme di oggetti caratterizzati dallo stesso insieme di comportamenti possibili (metodi) stati possibili (variabili istanza o campi) Es. tutte le caselle vocali di un certo tipo appartengono ad una stessa classe Mailbox Esempio: Rectangle Oggetti di tipo rettangolo: Per descrivere un rettangolo posso specificare L ascissa x e l ordinata y del suo angolo inferiore sinistro il valore della larghezza (width) il valore dell altezza (height) stato height=30 y=10 width=20 x=5

Esempio: Rectangle cont. Operazioni possibili: traslazione del punto iniziale: translate(x,y) recupero valore altezza: getheight() modifica ampiezza e altezza: resize(w,h) intersezione con altro rettangolo: intersection(r) test intersezione non vuota: intersects(r) test uguaglianza: equals(o) etc. Classi in Java In Java il comportamento di un oggetto è descritto da una classe Una classe ha Un interfaccia pubblica Insieme di metodi (funzioni) che si possono invocare per manipolare l oggetto Es.: Rectangle(x_init,y_init,width_init,height_init) metodo dell interfaccia che crea un rettangolo (costruttore) Un implementazione nascosta codice e variabili usati per implementare i medodi dell interfaccia e non accessibili all esterno della classe. Es.: x,y,width,height

Possibili stati: le variabili istanza Le variabili istanza (campi) memorizzano lo stato di un oggetto Ciascun oggetto di una certa classe ha la propria copia delle variabili istanza Le variabili istanza solitamente possono essere lette e modificate solo dai metodi della stessa classe (incapsulamento dei dati) Possibili comportamenti: metodi I metodi di una classe esprimono la parte computazionale della classe somigliano a funzioni dei linguaggi procedurali tipo C possono utilizzare gli altri metodi della classe e manipolare il contenuto delle variabili istanza

Esempio: codice Java classe Rectangle File Rectangle.java public class Rectangle{ //costruttore public Rectangle(int x_init,int y_init,int width_init, int height_init) { x=x_init; y=y_init; width=width_init; height=height_init; //metodo che sposta il rettangolo public void translate(int x_new,int y_new){ x=x+x_new; y=y+y_new; return; //altri metodi // variabili di istanza private int x,y,width,height; Variabili oggetto La variabile cerealbox contiene un riferimento (indirizzo) ad un oggetto di tipo rettangolo.

Creazione di oggetti (1) Rectangle cerealbox; Definisce una variabile oggetto rettangolo non inizializzata è buona norma inizializzare sempre le variabili oggetto cerealbox = new Rectangle(5, 10, 20, 30); Crea un rettangolo e assegna il suo indirizzo a cerealbox Creazione di oggetti (2) Rectangle cerealbox = new Rectangle(5, 10, 20, 30); Rectangle r = ceralbox; (assegnamento a variabile) Si ottengono due variabili oggetto che si riferiscono allo stesso oggetto

Creazione di Oggetti (3) Quando viene creato l'oggetto cerealbox con Rectangle cerealbox = new Rectangle(5, 10, 20, 30); viene allocato uno spazio di memoria in cui sono conservati i valori di x, y, width e height quindi ciascuna istanza di Rectangle ha le proprie copie delle variabili x, y, width e height gli indirizzi dei metodi Rectangle, translate, etc. quindi i metodi di tutte le istanze di Rectangle sono implementati con lo stesso codice Definizione di una classe File Rectangle.java public class Rectangle{... Nome della classe Specificatore di accesso specificatore di accesso public indica che la classe Rectangle è utilizzabile anche al di fuori del package di cui fa parte la classe una classe pubblica deve essere contenuta in un file avente il suo stesso nome Es.: la classe Rectangle è memorizzata nel file Rectangle.java

Definizione di una variabile istanza Specificatore di accesso tipo della variabile Nome della variabile private int x ; Lo specificatore di accesso indica la visibilità (scope) della variabile private indica che la variabile istanza può essere letta e modificata solo dai metodi della classe dall esterno è possibile accedere alle variabili istanza private solo attraverso i metodi pubblici della classe Solo raramente le variabili istanza sono dichiarate public Il tipo delle variabili istanza può essere una classe, Es.: String un array Tipi riferimento un tipo primitivo, Es.: int Definizione di un metodo public void translate(int x_new, int y_new) { Specificatore di accesso x=x+x_new; y=y+y_new; tipo di dato restituito return; Nome del metodo Corpo del metodo Elenco dei parametri Lo specificatore di accesso indica la visibilità (scopo) del metodo public indica che il metodo può essere invocato anche dai metodi esterni alla classe Rectangle (e anche da quelli esterni al package a cui appartiene la classe Rectangle )

Invocazione dei metodi Per invocare un metodo di un certo oggetto bisogna specificare il nome del metodo preceduto dal nome dell oggetto e da un punto Es.: cerealbox.translate(1,34); (Eseguiamo il metodo translate sull oggetto cerealbox passandogli i valori 1 e 34) L oggetto funge da parametro implicito nell invocazione del metodo E come passare a translate come terzo parametro cerealbox Parametri impliciti All interno di un metodo per riferirsi esplicitamente al parametro implicito si può usare la parola chiave this Il nome di una variabile istanza o di un metodo all interno di un metodo di una classe si riferisce alla variabile istanza o al metodo del parametro implicito A volte per chiarezza si usa this.nomemetodo o this.nomevariabile ad es., in un metodo che esegue un operazione con un altro oggetto della stessa classe this.x = paramrect.getx(); (paramrect è un oggetto della classe Rectangle passato come parametro al metodo)

Il metodo costruttore public Rectangle(int x_init,int y_init,int width_init, int height_init) { x=x_init; y=y_init; width=width_init; height=height_init; Una classe può implementare un metodo particolare, detto costruttore, che serve a inizializzare i nuovi oggetti Quando esiste un costruttore deve chiamarsi come la classe Per creare un oggetto di una classe deve essere invocato un costruttore della classe in combinazione con l operatore new Se una variabile di istanza non è inizializzata dal costruttore allora è inizializzata automaticamente a 0 se si tratta di un tipo numerico o a null se si tratta di un riferimento Overloading (sovraccarico) Più metodi con lo stesso nome Consentito se i parametri li distinguono, cioè hanno firme diverse (firma = nome del metodo + lista tipi dei parametri nell ordine in cui compaiono) Il tipo restituito non conta Frequente con costruttori Devono avere lo stesso nome della classe Es.: aggiungiamo a Rectangle il costruttore public Rectangle(int x_init,int y_init) { x=x_init; y=y_init; Usato anche quando dobbiamo agire diversamente a seconda del tipo passato Ad es., println della classe PrintStream

Usare classi di altri pacchetti Le classi non contenute nel pacchetto java.lang devono essere importate Es.: import java.awt.rectangle; Se interessano tutte le classi di un pacchetto si può usare il costrutto import nomepacchetto.* Es.: import java.awt.* In alternativa, si può specificare tutto il nome di ogni classe. Es.: java.awt.rectangle cerealbox = new java.awt.rectangle(5, 10, 20, 30); Esempio: importazione di Rectangle File MoveTest.java //importa la classe Rectangle del pacchetto java.awt import java.awt.rectangle; public class MoveTest { public static void main(string[] args) { Rectangle cerealbox = new Rectangle(5, 10, 20, 30); // sposta il rettangolo cerealbox.translate(15, 25); // stampa il rettangolo spostato System.out.println(cerealBox);

Categorie di variabili Variabili istanza Appartengono all oggetto Esistono finché l oggetto esiste Hanno un valore iniziale di default Variabili locali Appartengono al metodo Vengono create all attivazione del metodo e cessano di esistere con esso Non hanno valore iniziale se non inizializzate Parametri formali Appartengono al metodo Vengono create all attivazione del metodo e cessano di esistere con esso Valore iniziale è il valore del parametro reale al momento dell invocazione Progettazione ad oggetti Caratterizzazione attraverso le classi delle entità (oggetti) coinvolte nel problema da risolvere (individuazione classi) identificazione delle classi identificazione delle responsabilità (operazioni) di ogni classe individuazione delle relazioni tra le classi dipendenza (usa oggetti di altre classi) aggregazione (contiene oggetti di altre classi) ereditarietà (relazione sottoclasse/superclasse ) Realizzazione delle classi

Realizzazione di una classe 1. individuazione dei metodi dell interfaccia pubblica: determinazione delle operazioni che si vogliono eseguire su ogni oggetto della classe 2. individuazione delle variabili istanza: determinazione dei dati da mantenere 3. individuazione dei costruttori 4. Codifica dei metodi 5. Collaudo del codice Incapsulamento dei Dati (1) In genere quando si definisce una classe, i metodi dell interfaccia pubblica sono dichiarati public, mentre i metodi di servizio e tutti i campi sono dichiarati private Si rende accessibile al mondo esterno solo l interfaccia dell oggetto e si nasconde la sua implementazione (astrazione delle caratteristiche della classe) L interfaccia determina il modo in cui l oggetto comunica con l ambiente circostante Questo processo di nascondere i dettagli di definizione degli oggetti si chiama incapsulamento dei dati ed è uno dei concetti base della programmazione a oggetti

Incapsulamento dei Dati (2) L incapsulamento dei dati presenta due notevoli vantaggi Gli oggetti sono protetti da un utilizzo errato o fraudolento Solo i metodi definiti per la classe possono alterare i campi di un oggetto Le classi sono facilmente riutilizzabili Alcuni programmatori possono utilizzare classi già definite Non hanno bisogno di sapere come è stata implementata la classe Possono creare oggetti appartenenti alla classe e invocarne i metodi dell interfaccia pubblica Possono creare nuove classi che utilizzano la classe come membro Programmi Java Un programma Java consiste di una o più classi Per poter eseguire un programma bisogna definire una classe pubblica che contiene un metodo main(string[ ] args)

Esempio: Classe Conto Corrente Una classe che rappresenti dei conti correnti bancari potrebbe contenere Un campo in cui memorizzare il saldo Un float (tipo primitivo o oggetto) Un metodo costruttore Inizializza il saldo del nuovo conto corrente alla cifra con cui viene aperto Un metodo che legge il saldo del conto Un metodo che preleva denaro Un metodo che deposita denaro Esempio: Classe Conto Corrente public class ContoCorrente { // variabili di istanza private float saldo; // Costruttore public ContoCorrente(float saldoiniziale) { saldo = saldoiniziale; //metodi dell interfaccia pubblica public float leggisaldo(void) { return saldo; public void preleva(float quantita) { saldo = saldo - quantita; public void deposita(float quantita) { saldo = saldo + quantita;

Esempio: Classe Conto Corrente Un codice equivalente in C si servirebbe delle parole chiave struct e typedef e definirebbe le relative funzioni /* File sorgente conto_corrente.h */ typedef struct conto_corrente { float saldo; ; conto_corrente * new_conto_corrente(float); float leggi_saldo(conto_corrente *); void preleva(conto_corrente *, float); void deposita(conto_corrente *, float); /* File sorgente conto_corrente.c */ conto_corrente * new_conto_corrente(float s) { conto_corrente *c=malloc(sizeof(conto_corrente)); c->saldo=s; return c; float leggi_saldo(conto_corrente *c) { return c->saldo; void preleva(conto_corrente *c, float p) { c->saldo=c->saldo+s; void deposita(conto_corrente *c, float d) { c->saldo=c->saldo-s; Esempio: Classe Conto Corrente Per gestire il conto corrente del signor Rossi, possiamo creare un oggetto di tipo ContoCorrente: ContoCorrente contorossi = new ContoCorrente(5000); Per tenere traccia dei movimenti che il signor Rossi fa sul suo conto corrente possiamo chiamare i relativi metodi: contorossi.preleva(100); // preleva 100 euro contorossi.deposita(200); // deposita 200 euro Per chiamare il metodo preleva inviamo il messaggio preleva all'oggetto contorossi

Funzionamento di contorossi Quando viene creato l'oggetto contorossi, viene allocato uno spazio di memoria in cui sono conservati il valore del saldo e gli indirizzi dei metodi preleva, deposita e leggisaldo L uso dell oggetto contorossi avviene attraverso i metodi dell interfaccia pubblica, non abbiamo bisogno di conoscere l implementazione sottostante (astrazione) Parallelo con il C Per fare la stessa cosa in C, possiamo creare una elemento di tipo conto_corrente, chiamando new_conto_corrente conto_corrente *conto_rossi = new_conto_corrente(5000); Per tenere traccia dei movimenti che il signor Rossi fa sul suo conto corrente possiamo chiamare le relative funzioni: prelievo(conto_rossi,100); // preleva 100 euro deposito(conto_rossi,200); // deposita 200 euro Per chiamare la funzione preleva dobbiamo usare conto_rossi come argomento!!!

Esempio: Classe Cliente Definiamo la classe cliente che utilizza la classe contocorrente public class Cliente { private String datianagrafici; private ContoCorrente conto; public Cliente(String dati, float saldo) { datianagrafici = dati; conto = new ContoCorrente(saldo) // Costruttore public String leggidati(void) { return datianagrafici; public float saldo(void) { return conto.leggisaldo(); Esercizio Implementare in Java una classe Punto che contiene le coordinate di un punto nel piano e ha come interfaccia pubblica i metodi per leggere e modificare le coordinate. Implementare la classe Rettangolo che differisce da Rectangle in quanto usa un istanza di Punto come vertice in basso a sinistra invece delle due coordinate. (Considerare per questa implementazione di Rettangolo un insieme di metodi a scelta che fanno uso del punto iniziale) Aggiungere alla classe ContoCorrente un metodo che aggiunga al saldo gli interessi annuali calcolati ad un tasso passato come parametro. Scrivere un breve programma per collaudare le classi: ContoCorrente e Cliente Punto Rettangolo