Fisica computazionale I - 21 OPERATORI
Fisica computazionale I - 22 OGGETTI Gli oggetti sono strutture di dati che possono essere create, attraverso la definizione di un riferimento. Gli oggetti sono strutture di dati che possono essere create, attraverso la definizione di un riferimento. Una volta costruito l'oggetto di riferimento, e' possibile in modo semplice costruire piu' copie di qell'oggetto ed utilizzarle, in un certo senso, come se si trattasse di nuovi tipi. Una volta costruito l'oggetto di riferimento, e' possibile in modo semplice costruire piu' copie di qell'oggetto ed utilizzarle, in un certo senso, come se si trattasse di nuovi tipi.
Fisica computazionale I - 23 Loggetto Libro public class Libro{ String autore; String titolo; double prezzo; public Libro(String a, String t, double p) { autore = a; titolo = t; prezzo = p; } public String getAutore() { return autore; } public String getTitolo() { return titolo; } public String getPrezzo() { return prezzo; } } public class Libro{ String autore; String titolo; double prezzo; public Libro(String a, String t, double p) { autore = a; titolo = t; prezzo = p; } public String getAutore() { return autore; } public String getTitolo() { return titolo; } public String getPrezzo() { return prezzo; } }
Fisica computazionale I - 24 Come usare loggetto Libro compiliamo con il comando javac questo programma. Avremo ora a disposizione l'oggetto Libro, e qualunque nostro programma potra' utilizzarlo. Potremo scrivere, all'interno del nostro programma: compiliamo con il comando javac questo programma. Avremo ora a disposizione l'oggetto Libro, e qualunque nostro programma potra' utilizzarlo. Potremo scrivere, all'interno del nostro programma: Libro libro1 = new Libro("Giovanni Rossi", "Le mie memorie", 57.00); Libro libro2 = new Libro("Mario Bianchi", "Viaggio in Turchia", 35.00); Libro libro1 = new Libro("Giovanni Rossi", "Le mie memorie", 57.00); Libro libro2 = new Libro("Mario Bianchi", "Viaggio in Turchia", 35.00); Abbiamo cioe' creato due copie dell'oggetto Libro, caratterizzate ciascuna da un titolo, un autore, un prezzo. In termini piu' corretti abbiamo create due differenti 'istanze' della 'classe' Libro. In seguito, potremo ritrovare le caratteristiche di ogni libro, con chiamate ai metodi di quell'oggetto, ovvero di quella classe Abbiamo cioe' creato due copie dell'oggetto Libro, caratterizzate ciascuna da un titolo, un autore, un prezzo. In termini piu' corretti abbiamo create due differenti 'istanze' della 'classe' Libro. In seguito, potremo ritrovare le caratteristiche di ogni libro, con chiamate ai metodi di quell'oggetto, ovvero di quella classe double pp1 = libro1.getPrezzo(); double pp2 = libro2.getPrezzo(); String autore1 = libro1.getAutore(); double pp1 = libro1.getPrezzo(); double pp2 = libro2.getPrezzo(); String autore1 = libro1.getAutore();
Fisica computazionale I - 25 Costruire meglio un oggetto Un oggetto puo' avere piu' costruttori, distinti per numero e qualita' degli argomenti. E' buona norma che un oggetto abbia anche un costruttore di default, cioe' senza argomenti: Un oggetto puo' avere piu' costruttori, distinti per numero e qualita' degli argomenti. E' buona norma che un oggetto abbia anche un costruttore di default, cioe' senza argomenti: public Libro() { } public Libro() { } E' anche buona norma che l'oggetto abbia dei metodi per fissare i valori di ogni campo, per esempio: public void setAutore(String a) { autore = a; } E' anche buona norma che l'oggetto abbia dei metodi per fissare i valori di ogni campo, per esempio: public void setAutore(String a) { autore = a; } Il nostro oggetto quindi sarebbe meglio costruito dal seguente codice: Il nostro oggetto quindi sarebbe meglio costruito dal seguente codice:
Fisica computazionale I - 26 Costruire un oggetto Un oggetto e' in generale caratterizzato da: Un oggetto e' in generale caratterizzato da: - una serie di campi, fields in inglese, nel nostro esempio abbiamo autore, titolo, prezzo; - una serie di campi, fields in inglese, nel nostro esempio abbiamo autore, titolo, prezzo; - un 'costruttore': e' il blocco di codice: - un 'costruttore': e' il blocco di codice: public Libro(String a, String t, double p) { autore = a; titolo = t; prezzo = p; } public Libro(String a, String t, double p) { autore = a; titolo = t; prezzo = p; } - una serie di metodi. - una serie di metodi.
Fisica computazionale I - 27 Loggetto Libro definito meglio public class Libro{ String autore; String titolo; double prezzo; public Libro(){ } public Libro(String a, String t,double p) { autore = a; titolo = t; prezzo = p; } public String getAutore() { return autore; } public String getTitolo() { return titolo; } public double getPrezzo() { return prezzo; } public void setAutore(String a){ autore = a;} public void setTitolo(String a){ titolo = a;} public void setPrezzo(double b){ prezzo = b;} } autore = a; titolo = t; prezzo = p; } public String getAutore() { return autore; } public String getTitolo() { return titolo; } public double getPrezzo() { return prezzo; } public void setAutore(String a){ autore = a;} public void setTitolo(String a){ titolo = a;} public void setPrezzo(double b){ prezzo = b;} }
Fisica computazionale I - 28 Usare loggetto Libro Adesso potremo definire un nuovo libro, all'interno del nostro programma, anche nel seguente modo: Adesso potremo definire un nuovo libro, all'interno del nostro programma, anche nel seguente modo: Libro ilMioLibro = new Libro(); ilMioLibro.setAutore("Mario Rossi"); ilMioLibro.setTitolo("Manuale di Java"); ilMioLibro.setPrezzo(75.44); Libro ilMioLibro = new Libro(); ilMioLibro.setAutore("Mario Rossi"); ilMioLibro.setTitolo("Manuale di Java"); ilMioLibro.setPrezzo(75.44); Si noti che i campi (autore, titolo, prezzo) sono definiti esternamente ai metodi. Cio' vuol dire che le relative variabili sono comuni e visibili a tutti i metodi. In sostanza i campi, nel loro insieme caratterizzano l'oggetto libro e rendono ogni esemplare diverso da un altro. Questi campi costituiscono le variabili di 'istanza', nel senso che ogni istanza della classe ha un preciso insieme di valori. Si noti che i campi (autore, titolo, prezzo) sono definiti esternamente ai metodi. Cio' vuol dire che le relative variabili sono comuni e visibili a tutti i metodi. In sostanza i campi, nel loro insieme caratterizzano l'oggetto libro e rendono ogni esemplare diverso da un altro. Questi campi costituiscono le variabili di 'istanza', nel senso che ogni istanza della classe ha un preciso insieme di valori.
Fisica computazionale I - 29 Si noti che il codice che abbiamo scritto per definire la classe Libro non contiene il metodo main; questo perche' intendiamo utilizzarlo non come applicazione isolata, ma come una definizione che utilizzeremo nell'ambito di altre applicazioni. In sostanza il codice definisce un nuovo 'tipo' di oggetti (una 'classe') che potremo utilizzare tutte le volte che ne abbiamo bisogno. Si noti che il codice che abbiamo scritto per definire la classe Libro non contiene il metodo main; questo perche' intendiamo utilizzarlo non come applicazione isolata, ma come una definizione che utilizzeremo nell'ambito di altre applicazioni. In sostanza il codice definisce un nuovo 'tipo' di oggetti (una 'classe') che potremo utilizzare tutte le volte che ne abbiamo bisogno. Potremo poi costruire 'collezioni' di oggetti. Restando nel campo librario, e' facile immaginare che ci fara' comodo costruire una 'Libreria' intesa come raccolta di 'Libri'; ma anche costruire 'collezioni' di oggetti eterogenei: l'esempio piu' classico e' il famoso 'carrello' dei siti web che vendono merci varie via internet. Potremo poi costruire 'collezioni' di oggetti. Restando nel campo librario, e' facile immaginare che ci fara' comodo costruire una 'Libreria' intesa come raccolta di 'Libri'; ma anche costruire 'collezioni' di oggetti eterogenei: l'esempio piu' classico e' il famoso 'carrello' dei siti web che vendono merci varie via internet.
Fisica computazionale I A volte ci sono situazioni in cui, durante l'esecuzione, dobbiamo verificare a quale classe appartiene uno specifico oggetto. Ci sono vari modi per farlo. Uno dei piu' semplici utilizza l'operatore instanceof. Esempio: A volte ci sono situazioni in cui, durante l'esecuzione, dobbiamo verificare a quale classe appartiene uno specifico oggetto. Ci sono vari modi per farlo. Uno dei piu' semplici utilizza l'operatore instanceof. Esempio: boolean b; b = (ilmioLibro instanceof Libro); boolean b; b = (ilmioLibro instanceof Libro); se ilmioLibro e' effettivamente una istanza della classe Libro, la variabile b assume il valore true, altrimenti b assume il valore false. Gli oggetti possono essere dichiarati ed inizializzati, all'interno di un programma, in modo del tutto simile ai tipi primitivi: se ilmioLibro e' effettivamente una istanza della classe Libro, la variabile b assume il valore true, altrimenti b assume il valore false. Gli oggetti possono essere dichiarati ed inizializzati, all'interno di un programma, in modo del tutto simile ai tipi primitivi: IlMioOggetto ogg; ogg = new IlMioOggetto(); IlMioOggetto ogg; ogg = new IlMioOggetto(); Un oggetto non inizializzato assume per default il valore null; in sostanza, per ogni classe, esiste l'elemento null, che rappresenta appunto l'istanza di default di quella classe. Il tentativo di usare un oggetto con valore null provoca un errore al momento dell'esecuzione.
Fisica computazionale I ECCEZIONI Durante l'esecuzione di un programma si possono verificare delle condizioni di errore che portano ad una interruzione della esecuzione. Durante l'esecuzione di un programma si possono verificare delle condizioni di errore che portano ad una interruzione della esecuzione. Java fornisce un semplice meccanismo per gestire, in fase di esecuzione, le condizioni di errore, ed evitare che il programma abortisca malamente. Java fornisce un semplice meccanismo per gestire, in fase di esecuzione, le condizioni di errore, ed evitare che il programma abortisca malamente. try { } catch(Exception e) { } try { } catch(Exception e) { }
Fisica computazionale I Viene eseguito il blocco di codice che segue l'istruzione try: se durante l'esecuzione si verifica una condizione di errore l'esecuzione viene interrotta e si passa ad eseguire il blocco di codice che segue l'istruzione catch. Successivamente, si continua con il codice che segue. try { } catch(Exception e) { System.out.println("Errore: "); } Viene eseguito il blocco di codice che segue l'istruzione try: se durante l'esecuzione si verifica una condizione di errore l'esecuzione viene interrotta e si passa ad eseguire il blocco di codice che segue l'istruzione catch. Successivamente, si continua con il codice che segue. try { } catch(Exception e) { System.out.println("Errore: "); } Exception e' una vera e propria classe nel senso usuale del termine in Java; quindi la scrittura catch(Exception e) significa che, in caso di errore, viene creata l'istanza e della classe Exception. Potremo quindi utilizzare tutti i metodi della classe Exception: in particolare, esiste il metodo printStackTrace() che ci consente di localizzare esattamente in quale istruzione si e' verificata l'eccezione try { } catch(Exception ex) { ex.printStackTrace();} Exception e' una vera e propria classe nel senso usuale del termine in Java; quindi la scrittura catch(Exception e) significa che, in caso di errore, viene creata l'istanza e della classe Exception. Potremo quindi utilizzare tutti i metodi della classe Exception: in particolare, esiste il metodo printStackTrace() che ci consente di localizzare esattamente in quale istruzione si e' verificata l'eccezione try { } catch(Exception ex) { ex.printStackTrace();}
Fisica computazionale I La classe Exception comprende varie sottoclassi, specializzate nel gestire le possibili differenti cause di errore. Tuttavia non e' realistico pensare di poter gestire tutte le possibili cause di errore in tutte le situazioni. Quindi le Exceptions Java si dividono in due categorie: checked e unchecked. Le Exceptions checked sono quelle che richiedono obbligatoriamente di essere gestite (per esempio attraverso la clausola try/catch). Ovvero, in alternativa, e' possibile utilizzare la speciale clausola throws nella dichiarazione del metodo entro cui questo problema potrebbe verificarsi. Per esempio: La classe Exception comprende varie sottoclassi, specializzate nel gestire le possibili differenti cause di errore. Tuttavia non e' realistico pensare di poter gestire tutte le possibili cause di errore in tutte le situazioni. Quindi le Exceptions Java si dividono in due categorie: checked e unchecked. Le Exceptions checked sono quelle che richiedono obbligatoriamente di essere gestite (per esempio attraverso la clausola try/catch). Ovvero, in alternativa, e' possibile utilizzare la speciale clausola throws nella dichiarazione del metodo entro cui questo problema potrebbe verificarsi. Per esempio: void readFile(String s) throws IOException void readFile(String s) throws IOException { { } in questo caso le eccezioni della sottoclasse IOException verranno ignorate. in questo caso le eccezioni della sottoclasse IOException verranno ignorate.
Fisica computazionale I Ignorare una eccezione e' naturalmente delicato: lo si puo' fare solo quando si e' veramente sicuri di cio' che avverra' in conseguenza di questa omissione. E' quindi piu' prudente, almeno per un principiante, gestire il problema con la clausola try/catch. Questo discorso puo' per il momento apparire molto complicato. Lo capiremo meglio in seguito. Per il momento ci faremo aiutare dal compilatore: se avremo omesso di gestire correttamente una eccezione esso ci indirizzera' con un messaggio tipo Ignorare una eccezione e' naturalmente delicato: lo si puo' fare solo quando si e' veramente sicuri di cio' che avverra' in conseguenza di questa omissione. E' quindi piu' prudente, almeno per un principiante, gestire il problema con la clausola try/catch. Questo discorso puo' per il momento apparire molto complicato. Lo capiremo meglio in seguito. Per il momento ci faremo aiutare dal compilatore: se avremo omesso di gestire correttamente una eccezione esso ci indirizzera' con un messaggio tipo... unreported exception java.xxx.yyyException; must be caught or declared to be thrown unreported exception java.xxx.yyyException; must be caught or declared to be thrown esso ci fara' capire quale istruzione deve essere protetta dalla clausola try/catch. Ci sono poi eccezioni unchecked: non siamo obbligati a gestirle, anche se siamo liberi di farlo, se lo riteniamo opportuno. esso ci fara' capire quale istruzione deve essere protetta dalla clausola try/catch. Ci sono poi eccezioni unchecked: non siamo obbligati a gestirle, anche se siamo liberi di farlo, se lo riteniamo opportuno.
Fisica computazionale I ARRAYS Un array e' un particolare tipo di oggetto in grado di contenere una collezione ordinata di elementi. Java supporta arrays di tutti i tipi primitivi ma anche di tutti gli oggetti. Gli arrays sono denotati dalle parentesi quadre []. Esempio Un array e' un particolare tipo di oggetto in grado di contenere una collezione ordinata di elementi. Java supporta arrays di tutti i tipi primitivi ma anche di tutti gli oggetti. Gli arrays sono denotati dalle parentesi quadre []. Esempio int[ ] gg; String[ ] aa; int[ ] gg; String[ ] aa; definisce un array di interi gg ed un array di String aa. E' anche possibile mettere le parentesi quadre dopo il nome dell'array: definisce un array di interi gg ed un array di String aa. E' anche possibile mettere le parentesi quadre dopo il nome dell'array: int gg[ ]; int gg[ ]; String aa[ ]; String aa[ ]; Per ora abbiamo semplicemente dichiarato che gg e aa sono varabili di tipo array. Ora possiamo inizializzare questi arrays: Per ora abbiamo semplicemente dichiarato che gg e aa sono varabili di tipo array. Ora possiamo inizializzare questi arrays: gg = new int[40]; aa = new String[25]; gg = new int[40]; aa = new String[25];
Fisica computazionale I Gli indici degli arrays cominciano da zero, come in C. Quindi il primo elemento di gg e' gg[0] e l'ultimo gg[39]. Ovviamente possiamo combinare insieme la dichiarazione e la inizializzazione dell'array: Gli indici degli arrays cominciano da zero, come in C. Quindi il primo elemento di gg e' gg[0] e l'ultimo gg[39]. Ovviamente possiamo combinare insieme la dichiarazione e la inizializzazione dell'array: int[] gg = new int[40]; int[] gg = new int[40]; La dimensione di un array e' disponibile nella variabile: length int[] gg = new int[40]; length int[] gg = new int[40]; int len = gg.length; int len = gg.length; si noti che length e' un campo, non un metodo;
Fisica computazionale I Se si cercasse di accedere ad un elemento al di fuori della dimensione dell'array si avrebbe un errore (in fase di esecuzione) ArrayIndexOutOfBoundsException. Se si cercasse di accedere ad un elemento al di fuori della dimensione dell'array si avrebbe un errore (in fase di esecuzione) ArrayIndexOutOfBoundsException. int[ ] gg = new int[40]; int a = gg[43]; // errore: indice fuori delle dimensioni int[ ] gg = new int[40]; int a = gg[43]; // errore: indice fuori delle dimensioni Questa Exception appartiene alle RunTimeException; quindi puo' essere ignorata, se si non ci si aspetta che avvenga, oppure gestita con il costrutto try/catch. Questa Exception appartiene alle RunTimeException; quindi puo' essere ignorata, se si non ci si aspetta che avvenga, oppure gestita con il costrutto try/catch.
Fisica computazionale I Possiamo a questo punto comprendere finalmente il significato della scrittura cha abbiamo finora utilizzato nel costruire il metodo main delle nostre applicazioni: Possiamo a questo punto comprendere finalmente il significato della scrittura cha abbiamo finora utilizzato nel costruire il metodo main delle nostre applicazioni: public static void main(String argv[]) il metodo main vuole come argomento una array, di lunghezza indefinita, di tipo String, che viene utilizzata per inserire dei parametri attraverso la riga di comando. Il numero di parametri che possono essere inseriti e'indefinito. il metodo main vuole come argomento una array, di lunghezza indefinita, di tipo String, che viene utilizzata per inserire dei parametri attraverso la riga di comando. Il numero di parametri che possono essere inseriti e'indefinito.
Fisica computazionale I public class Leggi { public static void main(String argv[]) public static void main(String argv[]) { String a1 = argv[0]; String a1 = argv[0]; String a2 = argv[1]; String a2 = argv[1]; System.out.println("Parametri letti " + a1 + " " + a2); System.out.println("Parametri letti " + a1 + " " + a2); }} Questo programma legge due parametri dalla riga di comando. Si aspetta percio' di trovare due stringhe, dopo il nome del programma; la riga di comando sara': java Leggi "Prima stringa" "Seconda stringa java Leggi "Prima stringa" "Seconda stringa Si noti che se non diamo al programma due stringhe da leggere, si ha un errore in esecuzione ArrayIndexOutOfBoundsException: un programma ben fatto dovrebbe gestire correttamente (con un costrutto try/catch) questa possibilita'. Si noti che se non diamo al programma due stringhe da leggere, si ha un errore in esecuzione ArrayIndexOutOfBoundsException: un programma ben fatto dovrebbe gestire correttamente (con un costrutto try/catch) questa possibilita'.
Fisica computazionale I ARRAYS MULTIDIMENSIONALI E' possibile creare arrays multidimensionali in maniera analoga a quanto abbiamo visto in precedenza E' possibile creare arrays multidimensionali in maniera analoga a quanto abbiamo visto in precedenza String[ ][ ] aa = new String[10][10]; crea un array aa con dimesioni 10x10. crea un array aa con dimesioni 10x10. boolean[ ][ ][ ] bb = new boolean[8][10][5]; crea un array bb con dimensioni 8x10x5. Non e' obbligatorio specificare tutte le dimensioni di un array con una singola istruzione new. E' obbligatorio specificare solo la prima dimensione, mentre le altre possono essere lasciate indefinite e specificate piu' tardi. crea un array bb con dimensioni 8x10x5. Non e' obbligatorio specificare tutte le dimensioni di un array con una singola istruzione new. E' obbligatorio specificare solo la prima dimensione, mentre le altre possono essere lasciate indefinite e specificate piu' tardi.
Fisica computazionale I boolean[ ][ ] c; c = new boolean[5][ ]; crea un array bidimensionale, lasciando indefinita la seconda dimensione. Ovviamente gli elementi di questo array sono null finche' non definiamo anche la seconda dimensione, con: crea un array bidimensionale, lasciando indefinita la seconda dimensione. Ovviamente gli elementi di questo array sono null finche' non definiamo anche la seconda dimensione, con: c[0] = new boolean[10]; c[1] = new boolean[10]; c[2] = new boolean[10]; c[3] = new boolean[10]; c[4] = new boolean[10]; c[0] = new boolean[10]; c[1] = new boolean[10]; c[2] = new boolean[10]; c[3] = new boolean[10]; c[4] = new boolean[10];
Fisica computazionale I Uno dei vantaggi di questa proprieta' e' la possibilita' di creare arrays non rettangolari: Uno dei vantaggi di questa proprieta' e' la possibilita' di creare arrays non rettangolari: boolean[ ][ ] c; c = new boolean[5][ ]; c[0] = new boolean[100]; boolean[ ][ ] c; c = new boolean[5][ ]; c[0] = new boolean[100]; c[1] = new boolean[5]; c[2] = new boolean[10]; c[3] = new boolean[10]; c[4] = new boolean[10]; c[1] = new boolean[5]; c[2] = new boolean[10]; c[3] = new boolean[10]; c[4] = new boolean[10]; Ora l'array c ha una seconda dimensione non omogenea. Potremo, ad esempio, creare un array triangolare con il seguente codice: Ora l'array c ha una seconda dimensione non omogenea. Potremo, ad esempio, creare un array triangolare con il seguente codice: int[ ][ ] triangolo = new int[5][ ]; for(int i=0; i < triangolo.length; i++) int[ ][ ] triangolo = new int[5][ ]; for(int i=0; i < triangolo.length; i++) { triangolo[ i ] = new int[i+1]; { triangolo[ i ] = new int[i+1]; }