Presentazione - Luca Andrea Ludovico

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