Lezione 18b Java: concetti e costrutti base Programmazione MIDI (Prof. Luca A. Ludovico) Tipizzazione JAVA Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Tipizzazione (type system) • Java è un linguaggio «type safe»: previene o avvisa rispetto agli errori di tipo • Un errore di tipo è un comportamento errato o non desiderabile del programma causato da una discrepanza tra diversi tipi di dato riguardo alle costanti, variabili e metodi (funzioni) del programma • Un linguaggio è considerato type safe se tutti gli errori di tipo vengono rivelati sempre tramite l’operazione di type check Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Esempi di errori di tipo • Assegnare a una variabile una costante del tipo errato • Invocare una funzione con tipi di dato errati • Superare i limiti di un array (out of bound) • Invocare un metodo inesistente di un oggetto • Accedere ad un campo dati inesistente di un oggetto Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Esempio public class EsempioTipizzazione { public static void main(String[] args) { int a; // Dichiara la variabile intera a a = 3.5; // ERRORE! Il valore 3.5 è numerico a virgola // mobile, la variabile a invece è intera } } Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Type check • Il type check è il controllo dei tipi e del loro corretto utilizzo • In generale può avvenire a compile-time o a run-time: – a compile-type, esso produce un eseguibile già controllato che non richiede controlli a run-time. Ciò permette un'esecuzione più veloce del programma, a fronte di controlli più severi e limitanti; – a run-time, il programmatore ha più libertà ma i controlli vengono eseguiti solo se una porzione di codice viene eseguita, quindi il codice può nascondere un errore che emergerà in altri utilizzi del programma. • In Java il type check ha luogo a compile-time Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Tipizzazione statica • Java è un linguaggio a tipizzazione statica: il tipo di ogni variabile (numerico intero, numerico a virgola mobile, carattere, ecc.) viene stabilito direttamente nel codice sorgente dove viene assegnato esplicitamente per mezzo di parole chiave apposite (manifest typing) • Il programma mantiene in una tabella dei valori tutte le variabili dichiarate dal programmatore, insieme al loro tipo e al valore corrente. Un tentativo di assegnamento di un valore di tipo diverso da quello di una variabile causa un errore terminale. Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Tipi primitivi e tipi strutturati • Il linguaggio distingue: – tipi primitivi (che definiscono valori atomici) – tipi strutturati (che definiscono strutture dati composte). • I tipi primitivi sono detti anche tipi atomici e tipi base. Sono definiti nelle specifiche di linguaggio: di ognuno sono noti a priori l'insieme dei valori ammessi e gli operatori supportati. • I tipi strutturati sono anche tipi riferimento, cioè definiscono oggetti, e sono classi o interfacce. Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Tipi primitivi (tipi base) Tipo Descrizione Classe contenitore (vedi prossima slide) byte intero con segno a 8 bit Byte short intero con segno a 16 bit Short int intero con segno a 32 bit Integer long intero con segno a 64 bit Long float virgola mobile a 32 bit singola precisione (standard IEEE 754) Float double virgola mobile a 64 bit doppia precisione (standard IEEE 754) Double char carattere singolo Unicode (intero senza segno Character a 16 bit) boolean true o false Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Boolean Classi wrapper per i tipi base • I valori dei tipi base non sono oggetti. Tuttavia, per ogni tipo base è definita una corrispondente classe (definita in gergo tipo wrapper o tipo contenitore) nel package java.lang, la quale permette di incapsulare dentro un oggetto un valore di tipo primitivo. • Opportuni metodi della classe wrapper permettono di ottenere l'oggetto che incapsula un certo valore, e il valore incapsulato da un certo oggetto. • Dalla versione 5.0 in poi, sono supportati l'autoboxing e l'unboxing, che permettono di convertire da tipo primitivo a corrispondente classe wrapper e viceversa. – Non si tratta di una vera conversione, ma di una sintassi che «nasconde» la creazione di un oggetto della classe wrapper Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Tipi strutturati (tipi riferimento) • I tipi strutturati includono le classi per la gestione delle stringhe, gli array e le collezioni (liste, mappe, ecc.) • In generale i tipi strutturati sono definiti dall'utente (user-defined), cioè dal programmatore. Al contrario i tipi base sono predefiniti (built-in) • Fanno eccezione le classi degli array, definite nelle specifiche di linguaggio pur trattandosi di tipi strutturati Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Array • Un array (o vettore) è una struttura dati complessa, statica e omogenea, usata in molti linguaggi di programmazione Indice 0 1 2 3 4 5 6 7 8 9 Celle 13 25 0 -5 11 56 3 -46 -12 67 • Contiene contemporaneamente più valori dello stesso tipo, che è detto tipo base dell’array • Ogni posizione nell’array è detta cella e può contenere uno e un solo valore • Le celle di un array sono identificate da un numero intero detto indice che parte da 0 per la prima cella Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Dichiarazione di array • Per dichiarare un array: tipoBase[] nomeArray; • Per specificare la dimensione, cioè il numero di celle: nomeArray = new tipoBase[numCelle]; – In Java, la dimensione si può recuperare con il metodo length • Scrittura compatta tipoBase[] nomeArray = new tipoBase[numCelle]; • Per accedere alla cella ad un dato indice: System.out.println(nomeArray[indice]); (lettura) nomeArray[indice] = valore; (assegnamento, scrittura) Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Inizializzazione di array • I valori delle celle possono essere preimpostati in fase di dichiarazione con la sintassi (valida per int, char e string): tipoBase[] nomeArray = {val1, val2, …, valN}; • Per altri tipi base (ad esempio boolean): tipoBase[] nomeArray = new tipoBase[] {val1, val2, …, valN}; • Non è necessario dimensionare esplicitamente l’array perché la dimensione viene evinta dal numero di valori elencati. • Si ricordi che si tratta di una struttura dati statica, le cui dimensioni dopo la dichiarazione non possono variare. Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Array multidimensionali • Un array può avere più di una dimensione. In tal caso spesso viene spesso definito matrice (per similitudine con il significato matematico) • Un array multidimensionale ha due (o più) indici. Ogni indice rappresenta una dimensione. Ogni elemento è identificato dalla combinazione di valori di tutti gli indici del vettore. • Esempi di dichiarazione e assegnamento: tipoBase[][] nomeArray = new tipoBase[dim1][dim2]; nomeArray[indice1][indice2] = valore; Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Strutture di controllo JAVA Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Strutture di controllo • La sintassi Java è derivata da C/C++ • Strutture di controllo selettive: – if … else – switch … case • Strutture di controllo iterative – – – – while do … while for for each [agisce su un array o collezione] Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Switch … case • Utile per selezionare una tra diverse alternative sulla base di uno specifico valore int, short, byte o char – String è ammesso solo da Java 7 in poi • Forma base: switch (espressione) { case costante1: istruzioniRamo1; break; case costante2: istruzioniRamo2; break; ... default: istruzioniRamoDefault; break; } Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Switch … case • Ogni gruppo di righe di codice che inizia con la parola riservata case e termina con break è un case group. • La parola case è seguita da un valore costante (tipizzato come la variabile nello switch) e da “:” • La parola chiave break provoca l’uscita dal costrutto • Il gruppo default è opzionale, e viene invocato solo se non si trova corrispondenza con altri rami Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Array e strutture di controllo iterativo • Lettura iterativa di tutti gli elementi di un array – while o for, basandosi sulla dimensione dell’array – foreach, ciclando su tutti gli elementi dell’array Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Gestione delle eccezioni • La gestione delle eccezioni in Java viene trattata dalla sintassi try ... catch ... finally simile a quella del C++ int firstArg; if (args.length > 0) { try { firstArg = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println("Argument must be an integer"); System.exit(1); } } Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base Esempi della lezione • MIDIPitchArray.java – array • MIDIPitchToName.java – costrutto switch … case – argomenti del main • MIDIPitchScale.java – costrutti if … else, for e for each – applicazione di algoritmi semplici • BinaryParser.java – funzioni sulle stringhe – gestione delle eccezioni con try ... catch Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base