Programmazione a oggetti Quanti oggetti, tra di loro parlando, fanno programmi. Pilu Crescenzi piluc@dsi.unifi.it Università di Firenze Programmazione a oggetti p.1/32
Cosa è un oggetto Una scatola software contenente variabili (anche dette campi) e metodi. Programmazione a oggetti p.2/32
Un oggetto di tipo razionale Programmazione a oggetti p.3/32
Cosa è un messaggio Quando un oggetto A vuole che un oggetto B esegua uno dei metodi di B, l oggetto A invia un messaggio all oggetto B. Programmazione a oggetti p.4/32
Cosa è una classe Una classe è un prototipo che definisce i campi ed i metodi comuni a tutti gli oggetti di un certo tipo. Programmazione a oggetti p.5/32
Istanze di una classe Un oggetto concreto è un istanza della classe a cui appartiene. Programmazione a oggetti p.6/32
Definizione di una classe Formata dalla dichiarazione della classe ed il corpo della classe. Sintassi class nome Classe blocco Dichiarazione di un oggetto di tipo Razionale Razionale numerorazionale; Programmazione a oggetti p.7/32
Creazione di oggetti Mediante l operatore new (come nel caso degli array) ed il costruttore della classe. Sintassi new nome Classe( lista Parametri ) Creazione di un oggetto di tipo Razionale con numeratore pari a 3 e denominatore pari a 4. Razionale numerorazionale; numerorazionale = new Razionale( 3,4 ); Programmazione a oggetti p.8/32
Distruzione di oggetti Non esistono operatori ad-hoc. Un oggetto privo di riferimenti diviene memoria da riciclare (da parte del garbage collector). Razionale R = new Razionale( 10,15 ); R = new Razionale( 15,10); Programmazione a oggetti p.9/32
Usare gli oggetti Nome qualificato di campo/metodo: nome dell oggetto, seguito da un punto e dal nome del campo/metodo. Sintassi nome Oggetto.nome Variabile nome Oggetto.nome Metodo( lista Par ) Esempio numerorazionale.num numerorazionale.maggiore ( altronumraz ) Passaggio per riferimento: come per gli array, un oggetto passato come argomento ad un metodo può essere modificato dalle istruzioni contenute all interno del metodo. Programmazione a oggetti p.10/32
Oggetti come parametri formali Creando un nuovo oggetto per poi assegnare al parametro formale il riferimento al nuovo oggetto, non si modifica l oggetto originale. void cambiarazionale( Razionale r,int n,int d ) { Razionale h = new Razionale( n,d ); r = h; } Programmazione a oggetti p.11/32
Costruttori Hanno lo stesso nome della classe. Creano ed inizializzano la memoria necessaria ad immagazzinare i campi dell oggetto. Sintassi nome Classe( lista Parametri ) Esempio Razionale( int n,int d ) { num = n; den = d; } Se nessun costruttore viene definito, automaticamente uno senza parametri (detto di default). Programmazione a oggetti p.12/32
Metodo main Metodo da cui la classe inizia automaticamente l esecuzione. Sintassi public static void main( String[] args ) blocco Programmazione a oggetti p.13/32
Accessori e mutatori Consentono la lettura e la modifica di campi. Sintassi tipo Variabile getnome Var( ) blocco void setnome Var( lista Parametri ) blocco Esempio int getnum( ) { return num; } void setnum( int n ) { num = n; } Programmazione a oggetti p.14/32
La classe String Creazione di stringhe. Uso di stringhe. Programmazione a oggetti p.15/32
Concatenazione e sequenze escape Operatore +. String primomessaggio = "Buongiorno!"; String secondomessaggio = "Mi chiamo Pierluigi."; String messaggiototale; messaggiototale = primomessaggio+secondomessaggio; Sequenza escape: carattere \ seguito da altro carattere. \": doppio apice. \ : apice singolo. \\: carattere backslash. \n: per andare a capo nella stringa. \r per andare all inizio della riga corrente. \t per andare alla successiva tabulazione. Programmazione a oggetti p.16/32
Sovraccaricamento di metodi Firma di un metodo: nome del metodo, numero e tipo dei suoi parametri. All interno di una classe, i metodi devono avere tutti firma diversa I metodi presenti più volte con lo stesso nome si dicono sovraccaricati Programmazione a oggetti p.17/32
Ereditarietà Permette di definire una super-classe, e successivamente di definirne un altra più specializzata, detta sotto-classe, aggiungendo solo il necessario. Sintassi class nome Sotto extends nome Super blocco Risparmio di lavoro: sotto-classe eredita proprietà di super-classe, necessario programmare solo nuove funzionalità. Sotto-classe utilizza campi e metodi di super-classe (oltre a quelli aggiunti nella sua definizione). In sotto-classe, metodi di super-classe possono essere opportunamente ri-definiti. Programmazione a oggetti p.18/32
Gerarchia delle classi Indica le relazioni di ereditarietà. Rappresenta graficamente il processo di specializzazione. Programmazione a oggetti p.19/32
Ereditarietà e costruttori I costruttori non sono ereditati. Costruttore sotto-classe, per prima cosa, invoca costruttore super-classe mediante parola chiave super. Se non esplicitamente, implicitamente super( ): errore se super-classe non ha costruttore senza parametri. Invocazione del costruttore super-classe deve essere prima istruzione (altrimenti viene invocato super( )). Se sotto-classe non ha costruttori espliciti, costruttore di default invoca super( ). Programmazione a oggetti p.20/32
Forme bidimensionali e costruttori Programmazione a oggetti p.21/32
Ereditarietà e campi Sotto-classe può definire nuovi campi. Programmazione a oggetti p.22/32
Ereditarietà e metodi Sotto-classe può definire nuovi metodi. Programmazione a oggetti p.23/32
Ereditarietà e sovrascrittura Sotto-classe può sovrascrivere (ovvero, modificare) metodi di super-classe. Programmazione a oggetti p.24/32
Gerarchia di forme bidimensionali Programmazione a oggetti p.25/32
Ereditarietà e tipi di dato Un oggetto di una classe derivata è del tipo della sotto-classe e del tipo della super-classe (e di tutte le sue super-classi). Possibile usare un oggetto di una classe derivata in tutte le circostanze in cui è ammesso usare un oggetto della super-classe. Rettangolo miorettangolo; Quadrato mioquadrato = new Quadrato( 3 ); miorettangolo = mioquadrato; Non è possibile il contrario. Rettangolo miorettangolo = new Rettangolo( 3,2 ); Quadrato mioquadrato; mioquadrato = miorettangolo; Programmazione a oggetti p.26/32
Modificatori public: indica che non ci sono restrizioni su chi può utilizzare le classi, i campi oppure i metodi. private: rende il campo oppure il metodo non accessibili fuori dalla classe. Permette incapsulamento. static: indica metodi e campi che appartengono a tutta la classe e che non richiedono alcun oggetto per poter essere utilizzati. Metodi della classe Math (ad esempio, estrazione di numeri casuali o calcolo di radice quadrata). final: indica metodi e campi che non possono essere sovrascritti o modificati. Programmazione a oggetti p.27/32
Eccezioni Strumento per gestire il trattamento degli errori. Un eccezione è un istanza di una classe che, generalmente, estende Exception. Un metodo che rileva un errore genera un eccezione. L eccezione deve essere catturata dal codice che ha chiamato il metodo. Altrimenti gestore di default la gestisce (in genere, con un messaggio all utente). Programmazione a oggetti p.28/32
Generare eccezioni Mediante l istruzione throw. Sintassi tipo nome( lista Par ) throws lista Ecc throw oggetto Eccezione; Esempio Razionale(int n,int d) throws EccezioneRazionale { if ((n>0)&&(d>0)) { num = n; den = d; } else { throw new EccezioneRazionale( "N o D non positivo" ); } } Programmazione a oggetti p.29/32
Catturare eccezioni Mediante l istruzione try-catch. Sintassi try blocco catch (tipo Eccezione 1 nome Eccezione 1) Esempio Razionale nr = null; try { int num = (int)(math.random()*100); int den = (int)(math.random()*100); nr = new Razionale( num,den ); } catch ( EccezioneRazionale e ) { System.exit( 1 ); } System.out.println( nr.getnum()+"/"+nr.getden() ); Programmazione a oggetti p.30/32
Pacchetti Consentono di raggruppare classi che realizzano funzioni tra di loro collegate. Ogni classe fa parte di un pacchetto. Sintassi package nome Pacchetto; Nome di un pacchetto generalmente strutturato in più sequenze di caratteri separate da un punto. Esempio: piluc.gj.poligoni Per accedere alla classe di un pacchetto, si scrive il nome completo della classe, oppure si importa la classe facendo uso dell istruzione import. Sintassi import nome Pacchetto.nome Classe; import nome Pacchetto.*; Programmazione a oggetti p.31/32
Interfacce Strumento di progettazione: consistono di metodi dichiarati (e non definiti) e di costanti. Delegano l implementazione alle loro realizzazioni. Sintassi interface nome Interfaccia blocco class nome extends classe implements lista Interfacce blocco Esempio public interface Curva { public boolean contiene( Point p ); } public classe CurvaVuota implements Curva { public boolean contiene( Point p ) { return false; } } Programmazione a oggetti p.32/32