Fondamenti di Programmazione Prof ssa Elisa Tiezzi Programmazione

  • Slides: 40
Download presentation
Fondamenti di Programmazione Prof. ssa Elisa Tiezzi Programmazione orientata a oggetti 1

Fondamenti di Programmazione Prof. ssa Elisa Tiezzi Programmazione orientata a oggetti 1

Programmazione OO Dati Istruzioni = Metodi • Concetti base: – dati – istruzioni •

Programmazione OO Dati Istruzioni = Metodi • Concetti base: – dati – istruzioni • Dati: – variabili – tipi Programmazione Procedurale Dati Metodi = Classi • Istruzioni: – istruzioni base – strutture di controllo – sotto-programmi Programmazione a Oggetti 2

Cosa è un oggetto Variabili (stato) Metodi (comportamenti) Un oggetto è una “scatola” software

Cosa è un oggetto Variabili (stato) Metodi (comportamenti) Un oggetto è una “scatola” software contenente variabili (che descrivono lo stato di un oggetto) e metodi (detti suoi membri, definiscono i comportamenti) 3

Esempio: i numeri razionale 3/4 mul su b add div is. Bigger Eq ua

Esempio: i numeri razionale 3/4 mul su b add div is. Bigger Eq ua l Metodi di istanza: agiscono sul numero razionale 3 num is Variabili di istanza (campi): contengono i valori (lo stato) del numero razionale div Istanza: un preciso oggetto 4 4

Cosa è un messaggio Gli oggetti interagiscono e comunicano tra loro usando i messaggi

Cosa è un messaggio Gli oggetti interagiscono e comunicano tra loro usando i messaggi per ottenere maggiori funzionalità e comportamenti più complessi is. Bigger(razionale di confronto) num den altro oggetto utilizzato dal programma razionale 3/4 5

Usare gli oggetti • • • Inviare un messaggio ad un oggetto significa invocare

Usare gli oggetti • • • Inviare un messaggio ad un oggetto significa invocare un metodo dell’oggetto Accedere alle variabili di istanza di un oggetto significa poter manipolare o ispezionare il loro valore Sintassi per invocare un metodo/accedere alle variabili di istanza di un oggetto: – all’interno della definizione di un oggetto: metodo(lista_di_parametri) variabile – all’esterno della definizione di un oggetto (operatore ‘. ’): riferimento. Oggetto. metodo(lista_di_parametri) riferimento. Oggetto. variabile 6

Cosa è una classe Una classe è un “prototipo” che definisce le variabili e

Cosa è una classe Una classe è un “prototipo” che definisce le variabili e i metodi comuni a tutti gli oggetti di un certo tipo. Una classe è solo il modello di un oggetto e pertanto non riserva spazio di memoria per i suoi dati. Ogni oggetto ha il suo spazio dati, un oggetto è un’istanza di una classe. 7

Esempio classe Rational mul su b add div Tutti gli oggetti di tipo Rational

Esempio classe Rational mul su b add div Tutti gli oggetti di tipo Rational possiedono i due campi interi num e den ed almeno i 6 metodi riportati int num int den is. Bigger 8 is Eq ua l

oggetto 8/15 istanza di Rational add is int num=4 int den=5 ua l is.

oggetto 8/15 istanza di Rational add is int num=4 int den=5 ua l is. Bigger Eq int num=8 int den=15 div add b div b su mul su oggetto 4/5 istanza di Rational 9 is Eq l ua

Dichiarare una classe • class nome_classe { // definizione variabili // definizione metodi }

Dichiarare una classe • class nome_classe { // definizione variabili // definizione metodi } • Esempio: class Rational { int num; int den; // definizione metodi } 10

Dichiarare un oggetto • Sintatticamente la dichiarazione di un oggetto è del tutto analoga

Dichiarare un oggetto • Sintatticamente la dichiarazione di un oggetto è del tutto analoga alla dichiarazione di una variabile di tipo primitivo • Esempio: – Rational primo. Numero; essendo Rational una classe • La variabile dichiarata di tipo classe è un indirizzo ad un’area di memoria contenente l’oggetto vero e proprio 11

Istanza di un oggetto • L’operatore new crea un oggetto del tipo “indicato” dal

Istanza di un oggetto • L’operatore new crea un oggetto del tipo “indicato” dal metodo che immediatamente segue • Sintassi: – riferimento. Oggetto = new Nome. Classe(lista_di_parametri); essendo riferimento. Oggetto una variabile di tipo Nome. Classe • L’esecuzione di una tale istruzione comporta: – l’allocazione della memoria necessaria a contenere l’oggetto – l’assegnazione a riferimento. Oggetto dell’indirizzo di inizio dell’area di memoria allocata – l’inizializzazione delle variabili di istanza dell’oggetto dettate dalla lista di parametri del metodo Nome. Classe(lista_di_parametri) 12

Fondere le due fasi Rational primo. Numero; primo. Numero = new Rational(3, 4); è

Fondere le due fasi Rational primo. Numero; primo. Numero = new Rational(3, 4); è equivalente a Rational primo. Numero = new Rational(3, 4); 13

Oggetti e metodi • Un metodo può ritornare il riferimento ad un oggetto del

Oggetti e metodi • Un metodo può ritornare il riferimento ad un oggetto del tipo dichiarato dal valore di ritorno del metodo – Nome. Classe nome. Metodo(lista_input) • Un metodo può avere un parametro formale di tipo classe. Al momento dell’invocazione di un tale metodo, il parametro è inizializzato con la copia – Rational mul(Rational number) 14

Tipi primitivi e tipo classe • Un metodo non può cambiare il valore di

Tipi primitivi e tipo classe • Un metodo non può cambiare il valore di una variabile di un tipo primitivo passatagli come argomento • Un metodo può cambiare i valori delle variabili di istanza dell’oggetto indirizzato dalla variabile tipo classe che gli è passata come parametro 15

Il metodo main • main è un metodo speciale dal quale le applicazioni Java

Il metodo main • main è un metodo speciale dal quale le applicazioni Java iniziano automaticamente l’esecuzione • Sintassi: public static void main(String args) • È buona norma non includere il metodo main nella definizione di una classe il cui scopo è esclusivamente quello di definire un tipo – eccezione: per debugging 16

 • Esempio: class Rational. Test public static void main(String args) /* corpo del

• Esempio: class Rational. Test public static void main(String args) /* corpo del metodo main */ 17

I costruttori • Un costruttore è un metodo speciale designato a inizializzare le variabili

I costruttori • Un costruttore è un metodo speciale designato a inizializzare le variabili di istanza – nome uguale a quello della classe • Viene richiamato automaticamente quando l’oggetto è creato – new Nome. Classe(lista_di_parametri) • Un costruttore con una lista di argomenti vuota è detto costruttore di default • Se nella classe non è presente un costruttore, Java crea automaticamente un costruttore di default 18

Definizione dei Costruttori • La dichiarazione di un costruttore non include un tipo di

Definizione dei Costruttori • La dichiarazione di un costruttore non include un tipo di ritorno che è comunque un indirizzo – è un errore anteporre la parola chiave void • Esempio: class Rational int num, den; Rational(int n, int d) . . . num = n; den = d; 19

Un esempio riassuntivo class Rational int num, den; // variabili di istanza Rational(int n,

Un esempio riassuntivo class Rational int num, den; // variabili di istanza Rational(int n, int d) // costruttore num = n; den = d; Rational mul(Rational r) // operazione di moltiplicazione return new Rational(num*r. num, den*r. den); // altre operazioni aritmetiche boolean is. Bigger(Rational r) // confronto se maggiore return (num * r. den > den * r. num); // altre operazioni di confronto } 20

class Rational. Test public static void main(String args) Rational first. Num = new Rational(3,

class Rational. Test public static void main(String args) Rational first. Num = new Rational(3, 5); Rational second. Num = new Rational(2, 3); boolean is. Bigger. Result; is. Bigger. Result = first. Num. is. Bigger(second. Num); System. out. println (“Primo>secondo: “+is. Bigger. Result); 21

Firma (signature) di un metodo • La firma di un metodo è data dal

Firma (signature) di un metodo • La firma di un metodo è data dal nome del metodo e dal numero, tipo e ordine dei suoi parametri – Esempio di firme diverse: • int int • int my. Method(int i) è diverso da your. Method(int i) my. Method(int i) è diverso da my. Method(int i, double j) è diverso da my. Method(double j, int i) • Il valore di ritorno di un metodo non fa parte della firma del metodo stesso – Esempio di firme uguali: • int my. Method(int i) ha la stessa firma di double my. Method(int j) 22

Sovraccaricamento • Lo stesso nome di un metodo ha più di una definizione all’interno

Sovraccaricamento • Lo stesso nome di un metodo ha più di una definizione all’interno della stessa classe • I metodi sovraccarichi hanno lo stesso nome ma firme diverse tra loro – I costruttori sono spesso sovraccaricati 23

Esempio class Method. Overload int square(int x) return x*x; double square(double y) return y*y;

Esempio class Method. Overload int square(int x) return x*x; double square(double y) return y*y; int square(double x) return x*x; sovraccaricamento errore segnalato dal compilatore ………… 24

Sovraccaricamento e conversione • Se non si ha la corrispondenza con una qualche firma,

Sovraccaricamento e conversione • Se non si ha la corrispondenza con una qualche firma, Java effettua conversioni di tipo automatiche per trovare un’eventuale corrispondenza – una versione indesiderata del metodo può essere eseguita 25

INCAPSULAMENTO • Le variabili contenute in un oggetto dovrebbero essere modificate solo dal suo

INCAPSULAMENTO • Le variabili contenute in un oggetto dovrebbero essere modificate solo dal suo interno, solo i metodi dovrebbero essere gli unici responsabili del cambiamento delle variabili. • Un oggetto dovrebbe essere incapsulato rispetto a tutto il resto del sistema e dovrebbe interagire con le altre parti del programma solo attraverso un insieme specifico di metodi che definiscono i servizi che fornisce. 26

MODIFICATORI • Un modificatore è una parola chiave di Java usata per specificare delle

MODIFICATORI • Un modificatore è una parola chiave di Java usata per specificare delle caratteristiche particolari di un costrutto del linguaggio. • Alcuni modificatori sono chiamate modificatori di visibilità perché controllano fino a quale punto del programma è possibile usare un membro della classe. 27

Il modificatore public • Il modificatore public indica la totale assenza di restrizioni di

Il modificatore public • Il modificatore public indica la totale assenza di restrizioni di visibilità • Le classi dichiarate public possono essere referenziate ovunque public class Two. Dimensional. Shape ………… class shape. Test Two. Dimensional. Shape my. Shape; ………… } 28

 • I campi ed i metodi dichiarati public sono accessibili ovunque public class

• I campi ed i metodi dichiarati public sono accessibili ovunque public class A public int x; public int get. X() return x; class B public static void main(String[] args) { A a = new A(); a. x = 3; System. out. println(a. get. X()); } 29

Il modificatore private • Le variabili e i metodi dichiarati private sono accessibili soltanto

Il modificatore private • Le variabili e i metodi dichiarati private sono accessibili soltanto dai metodi della classe in cui sono definiti 30

Esempio public class Two. Dimensional. Shape private int width, height; private int generate( int

Esempio public class Two. Dimensional. Shape private int width, height; private int generate( int n ) return 1+(int)( Math. random*n ); public void set. Random. Width( int n ) width = generate( n ); public int get. Width( ) { return width; } } 31

class shape. Test public static void main( String[] args ) { Two. Dimensional. Shape

class shape. Test public static void main( String[] args ) { Two. Dimensional. Shape s = new Two. Dimensional. Shape(); s. width = s. generate( 100 ); ERRORE DOPPIO s. set. Random. Width( 100 ); System. out. println( s. get. Width( ) ); } 32

Caratteristiche dell’OOP Occultamento delle informazioni • protegge i dati all’interno di un oggetto –

Caratteristiche dell’OOP Occultamento delle informazioni • protegge i dati all’interno di un oggetto – usa variabili di istanza private • non permette un loro accesso diretto – usa metodi public per accedere alle variabili Incapsulamento • gli oggetti incapsulano attributi e metodi • nasconde i dettagli di una definizione di classe separando – interfaccia (API) – implementazione 33

La parola chiave static • Una variabile definita static è detta variabile di classe

La parola chiave static • Una variabile definita static è detta variabile di classe • Essa rappresenta informazioni valide per l’intera classe ed è condivisa da tutte le istanze della classe • Esempio: public class A static int x; ……… 34

 • Un metodo definito static è detto metodo di classe • Esso definisce

• Un metodo definito static è detto metodo di classe • Esso definisce un comportamento identico per tutte le istanze della classe ossia indipendente dagli oggetti • Esempio: Math. random() • E’ un errore di sintassi per un metodo static chiamare un metodo di istanza o accedere ad una variabile di istanza 35

Accedere a membri static • • I membri static di una classe esistono indipendentemente

Accedere a membri static • • I membri static di una classe esistono indipendentemente dall’esistenza di una istanza di tale classe Due tipi di accesso l Nome. Classe. nome. Metodo(lista_parametri) Nome. Classe. nome. Variabile l rif. Oggetto. nome. Metodo(lista_parametri) rif. Oggetto. nome. Variabile essendo rif. Oggetto un riferimento a un oggetto di tipo Nome. Classe 36

La parola chiave final • La parola chiave final riferita a una variabile indica

La parola chiave final • La parola chiave final riferita a una variabile indica che essa non può essere modificata – Sintassi: final tipo NOME = costante; – Esempio final double PI = 3. 14159; 37

Librerie di classi Una libreria di classi è un insieme di classi che aiuta

Librerie di classi Una libreria di classi è un insieme di classi che aiuta il programmatore nello sviluppo del software. Un compilatore spesso viene distribuito con una libreria di classi fondamentali. Si possono ottenere separatamente delle librerie commerciali. Tecnicamente una libreria non fa parte della definizione del linguaggio. La libreria standard viene distribuita con qualsiasi ambiente di sviluppo. 38

API e package • Una libreria di classi è composta da gruppi di classi

API e package • Una libreria di classi è composta da gruppi di classi tra loro collegate, spesso indicate collettivamente come API (Application Programmer Interface). E’ possibile per esempio riferirsi al Java Database API quando si parla dell’insieme delle classi che permettono di interagire con una base di dati. • Le classi della libreria standard di Java sono raggruppate in package che, come le API, permettono di indicare con un unico nome delle classi tra loro collegate. Ad esempio la classe String fa parte del package java. lang. 39

La clausola IMPORT • Le classi del package java. lang sono automaticamente rese disponobili

La clausola IMPORT • Le classi del package java. lang sono automaticamente rese disponobili durante la scrittura di un programma. • Se si vogliono usare le classi appartenenti ad altri package, occorre specificare il nome della classe insieme al nome del package, oppure usare la clausola import. • Es. : java. util. Random import java. util. * 40