Java: concetti e costrutti base 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 a 16 bit) Character boolean true o false Boolean Programmazione MIDI (Prof. Luca A. Ludovico) 18b. Java: concetti e costrutti base
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 Celle 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 1 2 3 4 5 6 7 8 9 13 25 -5 11 56 -46 -12 67 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
JAVA Strutture di controllo 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 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