Java Slides
Java Slides
Testo adottato: S. Mizzaro, Introduzione alla programmazione con il linguaggio Java. Altri testi consigliati: G. Pighizzini, M. Ferrari, Dai fondamenti agli oggetti Addison Wesley, 2005. Introduzione a Java (dispensa) (www.dimi.uniud.it/demis) Trasparenze sul linguaggio Java (www.dimi.uniud.it/demis) Manuale Java online (java.sun.com)
I token sono suddivisi in 5 categorie: parole chiave letterali identicatori operatori separatori
N.B. oltre ai token un programma Java pu includere spazi e commenti che il compilatore ignora.
Parole chiave
Le parole chiave hanno un uso e un signicato speciale in Java.
abstract boolean break byte case catch char class const goto
default
do
double
else
extends nal
nally
oat
for
package
if
implements
import
instanceof
int
interface
long
native
new
synchronized
private
protected
public
return
short
static
strictfp
super
switch
this
throw
throws
transient
try
void
volatile
while
continue
Letterali
I letterali si dividono in
numeri interi (es: -679) numeri decimali o in virgola mobile (es: +23.789) valori booleani (true e false) caratteri UNICODE (es: a) stringhe (es: pippo) il riferimento nullo null
Identicatori
Gli identicatori rappresentano nomi che possono essere assegnati a variabili, metodi, classi, ecc. Un identicatore composto esclusivamente da lettere, numeri e caratteri _ e $ e deve cominciare con una lettera, con _ , oppure con $.
Un identicatore non pu essere una parola chiave, un letterale booleano, un letterale nullo. Identicatori validi: PIPPO, H2So4, $bank, nome_var Identicatori illegali: 2PIPPO, nome-var,int, true N.B. Java distingue fra lettere maiuscole e minuscole pertanto i due identicatori Pippo e PIPPO sono da considerarsi distinti.
Operatori
Gli operatori indicano un tipo di calcolo da eseguire su uno o pi dati, detti operandi, che possono essere letterali, variabili o risultati di valutazioni di espressioni
>
< ! ? : ~
^ += -= *= /= &= |= ^=
Separatori
I separatori sono i segni di punteggiatura del linguaggio
( )
{ }
[ ]
Commenti
/* questo e un commento */
come /* */ ed inoltre permette di creare automaticamente la documentazione Javadoc tutti i caratteri da // no a ne linea sono ignorati
// questo un commento
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi public VotiEsame(int n) { voti = new int[n]; // inizializza un vettore di lunghezza n } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi
5 commenti
public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi
17 parole chiave
public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi
9 letterali
public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi
36 identicatori
public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi
15 operatori
public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Esempio
/** Esempio di classe */ public class VotiEsame { private int voti[]; // variabile di tipo vettore di interi
52 separatori
public VotiEsame(int n) { voti = new int[n]; /* inizializza un vettore di lunghezza n*/ } // genera un vettore contenente interi pseudo-casuali compresi tra 15 e 31 public void generavoti() { int i=0; Random r=new Random(); for (i=0;i<voti.length;i++) voti[i]=15+r.nextInt(16); System.out.println("Vettore generato!"); } // stampa vettore public void stampavoti() { int i=0; for (i=0;i<voti.length;i++) System.out.println("Elemento in posizione "+i+": "+voti[i]); }
Tipo di dato = (Supporto, Operazioni) Tipi di dato primitivi e Tipi di dato astratti
Variabili
Una variabile una locazione della memoria
referenziabile mediante un identicatore.
contenere solo valori del supporto di tale tipo. riferimento, pu contenere un riferimento a qualunque istanza di T oppure il valore null.
Dichiarazione di variabili
Lassociazione di una variabile a un tipo ha
<tipo> <identificatore>; oppure <tipo> <identificatore1>,..., <identificatoreN>;
Esempi dichiarazioni
int X, pippo; double radice; float r,c; String Codice_fiscale; Persona p1,p2,p3;
Assegnamento (=)
Loperatore di assegnamento (=) permette di memorizzare in una variabile un valore ottenuto dalla valutazione di una espressione.
<nome_variabile> = <espressione>;
In generale, <identificatore> e
<espressione>
Esempi di assegnamento
String parola=pippo; int x,y; dichiarazioni double d; d x y x y z = 3.1459; = 1; =(x*5)+4; = parola; = 3.29; = 6;
errori di assegnamento
Conversioni di tipo
A volte necessario assegnare espressioni di
tipo T1 a variabili di tipo T2, con T1 e T2 tipi di dato distinti. sempre possibile? chiamata casting e pu essere implicita o esplicita.
Casting implicito
Il casting implicito lecito quando non
int i=5; double j=3.1456; j = i; /* casting implicito lecito */ i = j; /* casting implicito illegale perdita di precisione */
Casting esplicito
i = (int) j; /* casting esplicito legale con perdita di precisione */ c = (char) i; /* assegna a c il codice UNICODE i */ j = (double) i; /* casting esplicito legale senza perdita di precisione */
Le classi
Un programma Java un insieme di denizioni di classi. La sintassi per denire una classe public class <nome classe> { <corpo della classe> }
il corpo di una classe costituito da dichiarazione di variabili (attributi della classe) e da denizioni di metodi (comportamento della classe)
Attributi di classe
Gli attributi sono variabili che permettono di modellare lo stato degli oggetti.
Metodi
Un metodo pubblico ha la seguente sintassi: public <tipo> <nome_metodo> (<lista_parametri>) { <corpo del metodo> } dove tipo il tipo del valore di ritorno del metodo, nome_metodo un identicatore, lista_parametri una sequenza (eventualmente vuota) di coppie tipo parametro che rappresenta i parametri di input del metodo, inne corpo del metodo la denizione del metodo vera e propria. Se il tipo di ritorno diverso da void (parola chiave che denota lassenza di un valore di ritorno), il corpo del metodo deve terminare con la parola chiave return seguita dal valore che deve essere restituito.
Metodo costruttore
Un metodo costruttore pubblico un metodo speciale che ha lo stesso nome della classe e che permette di creare oggetti (istanze) della classe. Nella denizione di tale metodo non compare il tipo di ritorno. Tipicamente un metodo costruttore denisce una lista di parametri attraverso i quali si assegnano dei valori agli attributi della classe. public <nome_costruttore> (<lista_parametri>) { <corpo del metodo> } Un oggetto O di una classe C si crea invocando il metodo costruttore della classe e istanziando gli opportuni parametri. La sintassi la seguente: new <nome_costruttore>(<valori_parametri>);
Esempi
public class Matrice { char [][] matrix; int numero_righe; int numero_colonne; public Matrice(int n, int m) {
matrix=new char [n][m]; numero_righe=n; numero_colonne=m;
public void stampaMatrice() { int i,j; for(i=0;i<numero_righe;i++){ for(j=0;j<numero_colonne;j++) System.out.print(matrix[j][i]+" "); System.out.println(""); } }
Esempi di metodi
tipo nome parametri void stampamatrice() { int i,j; for(i=0;i<numero_righe;i++){ for(j=0;j<numero_colonne;j++) System.out.print(matrix[j][i]+" "); System.out.println(""); } } corpo
int somma_numeri(int m, int n) { int z; z=m+n; return z; }
Esempi di metodi
tipo nome parametri void stampamatrice() { int i,j; for(i=0;i<numero_righe;i++){ for(j=0;j<numero_colonne;j++) System.out.print(matrix[j][i]+" "); System.out.println(""); } } corpo
int somma_numeri(int m, int n) { int z; z=m+n; return z; }
Invocazione di metodi
Dato un oggetto O di una classe C, creato invocando il metodo costruttore della classe C, e possibile invocare i metodi pubblici di O con la seguente sintassi : <nome_oggetto>.<nome_metodo>(<lista_parametri>) <lista_parametri> rappresenta la lista dei parametri attuali sui quali eseguire il metodo. { Matrice M = new Matrice(5,10); // codice per caricare i dati nella matrice // omesso... } M.stampaMatrice();
Osservazione
Per invocare un metodo denito in una
classe C allinterno di qualche metodo della stessa C si utilizza la notazione <nome_metodo>(<lista_parametri>) o in alternativa la notazione this.<nome_metodo>(<lista_parametri>)
Esempio
public Class Esempio { public int max(int u,int v) { if (u>v) return u; else return v; } public int usa_max(int x,int y) { int m; // invocazione metodo max // definito nella classe m = max(x,y); } System.out.println(m);
Overloading
In una classe possibile denire metodi con nome uguale ma parametri distinti (e pertanto comportamento distinto). In questo caso si parla di overloading.
public class Esempio_overloading { public void stampaDati(int n) { System.out.println("stampa numero "+n); } public void stampaDati(String s) { System.out.println("stampa stringa "+s); } }
Esempi
public class Matrice { char [][] matrix; int numero_righe; int numero_colonne; public Matrice(int n, int m) {
matrix=new char [n][m]; numero_righe=n; numero_colonne=m;
attributi
costruttore
public void stampaMatrice() { int i,j; for(i=0;i<numero_righe;i++){ for(j=0;j<numero_colonne;j++) System.out.print(matrix[j][i]+" "); System.out.println(""); } }
metodo
Esempi
class Matrice { char [][] matrix; int numero_righe; int numero_colonne; Matrice(int n, int m) {
attributi
costruttore
metodo
Esempi
class Esempio_Uso_Classe_Matrx { void creaScacchieradispari() { int i,j; char colore=b; Matrix scacchiera= new Matrix(3,3); for(i=0;i<numero_righe;i++) { for(j=0;j<numero_colonne;j++){ scacchiera[i][j]=colore; if (colore==b) colore=n; else colore=b; } }
Blocchi
Il codice Java diviso in blocchi delimitati da parentesi graffe aperte e chiuse. I blocchi possono essere annidati gli uni dentro gli altri.
Public Class Esempio { // def. attributi int x; String s; // def. metodi public Esempio(int y, String s) { } // corpo del costruttore
Esempio
Public Class Esempio { int x=5; // def. metodi public void metodoA(int y, String s) { char c=B; System.out.println(valore di x: +x); System.out.println(valore di c: +c); } public void metodoB() { String s=pippo; System.out.println(valore di s: +s); System.out.println(valore di c: +c); } }
Esempio
Public Class Esempio { int x=5; // def. metodi public void metodoA(int y, String s) { char c=B; System.out.println(valore di x: +x); System.out.println(valore di c: +c); } public void metodoB() { String s=pippo; System.out.println(valore di s: +s) System.out.println(valore di c: +c); } }
Ambito (cont.)
Che succede se dichiaro variabili con lo stesso nome? Non possibile dichiarare variabili con lo stesso nome allinterno dello stesso blocco.
public metodo() { int i; char i; /* errore i gi definita! */ ... }
possibile dichiarare variabili con lo stesso nome allinterno di blocchi distinti anche se sono annidati. Ci non crea alcun conitto, in quanto la dichiarazione pi interna nasconde le eventuali dichiarazioni pi esterne.
Esempio
Che valore stampa lesecuzione del metodo metodA()? E metodoB()?
Public Class Esempio { private int x=5; public void metodoA() { char x=A; } System.out.println(valore di x: +x);
Esempio
Che valore stampa lesecuzione del metodo metodA()? E metodoB()?
Public Class Esempio { private int x=5; public void metodoA() { char x=A; } System.out.println(valore di x: +x);
Esempio
Che valore stampa lesecuzione del metodo metodA()? E metodoB()?
Public Class Esempio { private int x=5; public void metodoA() { char x=A; } System.out.println(valore di x: +x);
Stampa il carattere A
Esempio
Che valore stampa lesecuzione del metodo metodA()? E metodoB()?
Public Class Esempio { private int x=5; public void metodoA() { char x=A; } System.out.println(valore di x: +x);
Stampa il carattere A
Stampa lintero 5
Espressioni
Unespressione permette di calcolare un risultato applicando opportuni operatori a un certo numero di operandi, che possono essere variabili, letterali, valori di ritorno di metodi o altre espressioni. 2*X+Y //esempio di espressione N.B. il tipo degli operandi deve essere compatibile con il tipo degli operatori. (Es. non posso moltiplicare un carattere e un numero!) Tipicamente il risultato di una espressione memorizzato in una variabile mediante loperatore di assegnamento. Z = 2*X+Y;
Operatori aritmetici
+ * / % addizione sottrazione moltiplicazione divisione resto della divisione intera
Questi operatori si applicano sia a numeri interi che a numeri frazionari. Loperatore / produce come risultato un intero se applicato a operandi interi, mentre ritorna un valore frazionario se applicato a operandi frazionari. Il risultato che si ottiene applicando tali operatori di tipo numerico (intero o frazionario). X % Y, produce il resto della divisione intera fra gli interi X e Y. Es. 12 % 7 ritorna come valore 5.
Y ha valore 1
Operatori relazionali
< <= > >= == != minore minore o uguale maggiore maggiore o uguale uguale diverso
Questi operatori confrontano due espressioni e ritornano un valore booleano (true oppure false). Permettono di costruire espressioni booleane. N.B. non si confonda loperatore di uguaglianza == con loperatore di assegnamento =.
Operatori logici
&& || ! and logico o congiunzione or logico o disgiunzione not o negazione
Questi operatori permettono di combinare assieme pi espressioni booleane. Ritornano sempre un risultato di tipo booleano.
Operatori logici
e1 true true false false e2 true false true false e1&& e2 true false false false e1|| e2 true true true false !e1 false -true --
Operatori ++ e -Questi operatori sono utilizzati, in notazione sia pressa che postissa, per incrementare o decrementare di 1 il valore di una variabile. Gli usi presso e postsso di tali operatori non sono equivalenti. Esempio: { int K,X=3,Y,W,Z=4; Z++; Y = X++; W = ++X; K = W--; } // // // // postincremento postincremento preincremento postdecremento
Operatori ++ e -Questi operatori sono utilizzati, in notazione sia pressa che postissa, per incrementare o decrementare di 1 il valore di una variabile. Gli usi presso e postsso di tali operatori non sono equivalenti. Esempio: { int K,X=3,Y,W,Z=4; Z++; Y = X++; W = ++X; K = W--; } // // // // Z prende il valore 5 Y prende 3 e X diventa 4
K prende 5 e W diventa 4
Blocco sequenziale
Permette di eseguire un insieme di istruzioni in sequenza. delimitato da una coppia di parentesi graffe. Nel caso la sequenza si riduca a una sola istruzione le parentesi graffe possono essere omesse (tranne il caso di blocchi denotanti corpi di classi o metodi). Pu contenere dichiarazioni di variabili in qualsiasi punto.
Denizione:
{ <istruzione <istruzione <istruzione ... <istruzione 1> 2> 3> n>
Esempio:
{ int x=1; double z; boolean b; z=x*4; b= !(z==x); System.out.println(b);
Strutture di controllo
Sono istruzioni che permettono di modicare il usso di esecuzione di un metodo
Istruzioni condizionale
La pi comune istruzione condizionale il blocco if-else, la cui sintassi la seguente: if (<condizione>) <blocco di istruzioni 1> else <blocco di istruzioni 2> La condizione deve essere unespressione booleana. Se la condizione valutata true allora si esegue il blocco di istruzioni 1, altrimenti si esegue il blocco di istruzioni 2 Le parentesi graffe delimitanti i blocchi possono essere omesse quando i blocchi di istruzioni sono costituiti da ununica istruzione.
Istruzioni condizionali
A volte il ramo else di una istruzione condizionale pu essere assente. In tal caso listruzione assume la seguente forma: if (<condizione>) <blocco di istruzioni>
Esegui il blocco di istruzioni se la condizione valutata true. { int X=4; if (X%2==0) System.out.println(X pari); }
Istruzioni condizionali
possibile unire pi istruzioni if-else per esprimere pi possibilit condizionali. La sintassi la seguente if (<condizione 1>) <blocco di istruzioni 1> else if (<condizione 2>) <blocco di istruzioni 2> ... else <blocco di istruzioni n> Se la condizione 1 valutata true, esegui il blocco di istruzioni 1, altrimenti se la condizione 2 valutata true, esegui il blocco di istruzioni 2, ... altrimenti se nessuna condizione vericata, esegui il blocco di istruzioni n.
Istruzioni condizionali:
possibile esprimere pi possibilit condizionali, in maniera molto intuitiva, utilizzando listruzione switch. switch (<espressione>){ case <letterale 1>: <blocco istruzioni 1> case <letterale 2>: <blocco istruzioni 2> ... default: <blocco istruzioni n> } Lespressione deve produrre un risultato byte, short, int o char. Viene valutata lespressione. Il risultato viene confrontato con ciascun case nellordine in cui questi compaiono. Se il risultato delli-esimo case coincide con il risultato dellespressione allora tutti i blocchi di istruzioni da i a n vengono eseguiti. Se il risultato non coincide con nessun case allora si esegue il blocco di istruzioni n relativo al default.
Istruzioni condizionali:
{int X=2; switch(X){ case 1: System.out.println(Uno); case 2: System.out.println(Due); default: System.out.println(Default); }
Istruzioni condizionali:
{int X=2; switch(X){ case 1: System.out.println(Uno); case 2: System.out.println(Due); default: System.out.println(Default); }
Istruzioni condizionali:
Nellistruzione switch, se si vuole eseguire solo il blocco di istruzioni corrispondente al letterale uguale al risultato dellespressione, si deve terminare il blocco di istruzioni con la parola chiave break. {int X=2; switch(X){ case 1: System.out.println(Uno);break; case 2: System.out.println(Due);break; default: System.out.println(Default); }
Istruzioni condizionali:
Nellistruzione switch, se si vuole eseguire solo il blocco di istruzioni corrispondente al letterale uguale al risultato dellespressione, si deve terminare il blocco di istruzioni con la parola chiave break. {int X=2; switch(X){ case 1: System.out.println(Uno);break; case 2: System.out.println(Due);break; default: System.out.println(Default); } Questo codice stampa la stringa Due
While (esempio)
{int i=0; while(i<10){ System.out.println(i); i++; }
While (esempio)
{int i=0; while(i<10){ System.out.println(i); i++; }
Istruzioni iterative: doListruzione do-while una istruzione iterativa che permette di ripetere pi volte lesecuzione di una porzione di codice. A differenza dellistruzione while, le istruzioni da ripetere sono poste prima della condizione da valutare. Pertanto il blocco di istruzioni si ripete sempre almeno una volta! Sintassi: do <blocco di istruzioni da ripetere> while(<condizione>); la condizione deve essere unespressione booleana. Finch il risultato dellespressione true, si ripete il blocco di istruzioni.
Do-while (esempio)
{int i=0; do { i++; System.out.println(i); } while(i<10); }
Do-while (esempio)
{int i=0; do { i++; System.out.println(i); } while(i<10); }
For (esempio)
{int i; for(i=0;i<11;i++) System.out.println(i);
For (esempio)
{int i; for(i=0;i<11;i++) System.out.println(i);
I vettori (o array)
Il vettore (o array) un oggetto che fornisce lo spazio di memoria per un elenco di elementi tutti dello stesso tipo componente T. Un vettore deve essere innanzitutto dichiarato mediante la seguente sintassi: <tipo>[] <nome_vettore>; int [] x,y; //dichiara x e y array di interi String [] frase; // dichiara un array di // stringhe di nome frase
Creazione di un vettore
Il tipo vettore un tipo riferimento. Un riferimento ad un array si crea mediante loperatore new. Quando si crea un vettore necessario specicare la dimensione (ovvero il numero di celle allocate). new <tipo> [<dimensione>]; x = new int [10];//alloca un vettore di 10 //celle e memorizza il //riferimento nella //variabile vettore X frase = new String[3]; //la variabile frase //pu contenere 3 stringhe
Creazione di un vettore
Un altro modo per creare un riferimento a un array consiste nel dare esplicitamente lelenco dei valori da memorizzare in fase di dichiarazione. int[] x={14,12,1,24,7,1,2,9,9,11}; String[] frase={questa,euna,frase};
Matrici
Una matrice un vettore multidimensionale, in cui gli elementi memorizzati sono riferiti attraverso delle n-uple di indici. Ci limiteremo ad usare matrici di dimensione 2. Nel caso di dimensione 2, una matrice pu essere interpretata come una griglia di valori (vettore di vettori). Ogni elemento di una matrice di dimensione 2 indicizzato mediante una coppia di indici (numero di riga, numero di colonna).
0 0 1 2
5 1 10
1 3 9
0 7 8
Matrici
Una matrice un vettore multidimensionale, in cui gli elementi memorizzati sono riferiti attraverso delle n-uple di indici. Ci limiteremo ad usare matrici di dimensione 2. Nel caso di dimensione 2, una matrice pu essere interpretata come una griglia di valori (vettore di vettori). Ogni elemento di una matrice di dimensione 2 indicizzato mediante una coppia di indici (numero di riga, numero di colonna).
0 0 1 2
5 1 10
1 3 9
0 7 8
Matrici
Una matrice deve essere innanzitutto dichiarata mediante la seguente sintassi: <tipo>[][] <nome_matrice>;
int [][] x;
La classe Random
la classe Random una classe predenita che permette di generare numeri pseudocasuali. contenuta nel package java.util e pertanto per poterla utilizzare necessario importare tale package con listruzione import java.util.Random; che deve essere posta allinizio della denizione della classe che user la classe Random. Per maggiori informazioni... http://java.sun.com/j2se/1.4.2/docs/api/java/util/Random.html
La classe Random
Alcuni metodi della classe Random:
Random() costruisce un oggetto della classe Random nextInt() genera un numero intero pseudo casuale nextInt(int n) genera un numero casuale compreso tra 0 e n-1 nextDouble()genera un numero di tipo double compreso
tra 0.0 e 1.0.
Esempio
{ Random R; int X; //Dichiarazione della variabile //di tipo Random R = new Random(); //Generazione di un //oggetto di tipo Random //e suo assegnamento alla //variabile R X = R.nextInt(15); //invocazione del metodo //nextInt, che genera un //numero pseudocasuale //compreso fra 0 e 14 e //assegnazione del numero //generato alla variabile // di tipo intero X }
La classe String
La classe String permette di rappresentare
sequenze di caratteri (i.e. stringhe). la manipolazione delle stringhe.
length() - calcola la lunghezza di una stringa es. String s=new String(pippo); int l=s.length(); // l=5 charAt(int i) - seleziona li-esimo carattere della stringa. es. String s=new String(pippo); char c=s.charAt(4); // c=o equals(Object s) - confronta la stringa con loggetto s1. Se sono uguali torna true altrimenti false es. String s1=new String(pippo); String s2=new String(pappa); boolean uguali=s1.equals(s2); // uguali=false
toUpperCase() - Converte i caratteri di una stringa in caratteri maiuscoli. es. String s=new String(PipPo); String s1= new String(s.toUpperCase()); // s1=PIPPO toLowerCase() - Converte i caratteri di una stringa in caratteri minuscoli. es. String s=new String(PipPo); String s1= new String(s.toLowerCase()); // s1=pippo
substring(int i, int j) - seleziona la sottostringa dalla posizione i (inclusa) alla posizione j (esclusa). es. String s=new String(Cappotto); String s2= new String(s.substring(4,s.length())); // s2=otto concat(String s) - Concatena la stringa con la stringa s. es. String s1=new String(No); String s2= new String(Where); s1=s1.concat(s2); //s1=NoWhere Nota: per concatenare due stringhe potete sempre usare loperatore +. Es. No+Where -> NoWhere
Ereditariet
possibile derivare una classe B (chiamata sottoclasse) a partire da una classe A (chiamata superclasse). La sottoclasse B eredita tutti i metodi e gli attribuiti della superclasse. Inoltre in B possiamo denire nuovi metodi e nuovi attributi non presenti in A. Tale meccanismo chiamato ereditariet. SINTASSI:
class <nome_sottoclasse> extends <nome_superclasse> { <corpo del sottoclasse> }
Alcune propriet
possibile denire il metodo costruttore della classe derivata a partire dal costruttore della superclasse utilizzando il costrutto
super(<lista valori>);
dove lista valori contiene i valori da passare come parametri al costruttore della superclasse. possibile denire nella sottoclasse metodi che hanno lo stesso nome di alcuni metodi della superclasse, ma parametri e comportamento distinti (overriding).
Esempio
class Persona { String nome; String cognome; int eta; Persona(String n, String c, int e){ nome=n; cognome=c; eta=e; } void stampaDati() { System.out.println("Salve, sono una persona e mi chiamo "+nome); System.out.println("Ho "+eta+" anni"); } public void modificaNome(String n) { nome=n; }
public String ottieniNome() { return Mr.+nome; } }
Esempio
public class Studente extends Persona { // sottoclasse derivata dalla classe Persona int matricola; // costruttore della sottoclasse Studente // si richiama il costruttore della sopraclasse // Persona mediante l'istruzione super public Studente(String n, String c, int e, int m) { super(n,c,e); matricola=m; } public void stampaDati() { System.out.println("Salve, sono uno studente e mi chiamo "+ nome+" "+cognome); System.out.println("Ho "+eta+" anni"+ " e il mio numero di matricola e' "+matricola); } public void modificaMatricola(int matr) { matricola=matr; }
Modicatori di accesso
I metodi e gli attributi di una classe possono essere dotati dei seguenti modicatori di accesso che ne limitano la visibilit. 1. private: specica che l!attributo, o il metodo, che segue pu essere acceduto solo dall!interno della classe; 2. protected: consente l!accesso anche alle sottoclassi e alle classi nello stesso package; 3. public: consente l!accesso a chiunque. In assenza di modicatori d!accesso, si applica il criterio public.
Es:
Interfacce
Uninterfaccia permette di denire una serie di prototipi di metodi che saranno successivamente implementati da una o pi classi. Uninterfaccia si denisce nel seguente modo: interface <nome_interfaccia> { <corpo dellinterfaccia> } dove nel corpo dellinterfaccia si denisce una lista di segnature di metodi (i.e. intestazioni di metodi).
Esempio
interface Misure { double Area(); double Perimetro(); }
Interfacce
Una classe pu implementare una o pi interfacce usando la seguente sintassi:
class <nome_classe> implements <nome_interfaccia1>, <nome_interfaccia2> { <corpo della classe> }
Class Rettangolo implements Figura { double base; double altezza; double xcoord; double ycoord; Rettangolo(x,y,a,b){ base=b;altezza=a;xcoord=x;ycoord=y; } double Area(){ return base*altezza; } double Perimetro(){ return 2*base+2*altezza; } }
Input/Output Standard
L I/O gestito mediante ussi (stream) di dati che permettono di collegare unapplicazione con i dispositivi di I/O.
System.out rappresenta lo standard output (tipicamente il monitor). dotato dei metodi print e println che permettono di stampare oggetti a video (rispettivamentre senza e con newline a ne stampa). Esempi: System.out.print(questa una stringa); System.out.println(questa una stringa);
System.in rappresenta lo standard input (tipicamente la tastiera). Permette di gestire un usso di byte in input (vedi slides successive).
Standard Input
Ingredienti: E necessario importare il pacchetto java per la gestione dellI/O (java.io.*) nel quale sono denite le seguenti classi: 1) IOException (classe che permette di gestire le anomalie e gli errori che si possono vericare durante la lettura/scrittura dei dati); 2) InputStreamReader (permette di convertire un usso in input di byte in un usso in input di caratteri); 3) BufferedReader (permette di prelevare/leggere da un usso di caratteri in input una stringa di caratteri o un singolo carattere attraverso i metodi readline() e read() rispettivamente.
Input di un carattere
import java.io.*; class EsempioLetturaCarattere { char leggiChar() throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); char c; System.out.print("Inserisci Carattere: "); c= (char)br.read(); return c; } }
Input di un intero
import java.io.*; class EsempioLetturaCarattere { int leggiIntero() throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int i; System.out.print("Inserisci Intero: "); i= Integer.parseInt(br.readLine()); return i; } }
Input di un double
import java.io.*; class EsempioLetturaCarattere { double leggiDouble() throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); double d; System.out.print("Inserisci valore Double: "); d= Double.parseDouble(br.readLine()); return d; } }
Esempio
class EsempioStandAloneconargomenti { // stampa i valori interi compresi tra args[0]e args[1] public static void main(String[] args) { int i; for (i=Integer.parseInt(args[0]);i<=Integer.parseInt(args[1]);i++) System.out.println(i); } }
Applet
Sono programmi scritti in Java che possono essere scaricati dalla rete essere eseguiti direttamente nei browser
Applet in Java
Ogni applet implementato come sottoclasse della classe predenita java.applet.Applet. Ogni applet deve implementare (ridenire) alcuni metodi ereditati dalla classe java.applet.Applet
init() - invocato al caricamento dellapplet. Deve essere denito solo in caso siano necessarie speciche operazioni di inizializzazione. start() - invocato al momento dellattivazione dellapplet (momento in cui larea dellapplet diventa visibile nella nestra del browser). paint(Graphics g) - output graco dellapplet stop() - invocato quando lapplet viene sospeso (momento in cui larea dellapplet non pi visibile nella nestra del browser). destroy() - invocato in concomitanza con la chiusura della pagina web contenente lapplet
il metodo paint
Permette di disegnare degli oggetti graci
nella nestra del browser. Per utilizzare le primitive grache di java necessario importare il pacchetto AWT. della classe Graphics rappresentante l'area grafica dell'applet. public void paint(Graphics g) permette di disegnare delle gure geometriche.
Prende in input come parametro un oggetto Graphics una classe predenita che
Un semplice esempio
import java.applet.Applet; import java.awt.Graphics; public class HelloWorld extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 50, 25); } }
Esempio:
<APPLET code=HelloWorld.class codebase=. width=500 height=500 >
La classe Graphics
drawArc(int x, int y, int width, int height, int startangle, int arcangle) - disegna un arco che origina in (x,y), largo width, alto height, il cui angolo iniziale e! startangle e l!angolo nale e! arcangle. drawString(String s,int x, int y) - stampa s alle coordinate (x,y). setColor(Color c) - setta il colore al colore Color.c Alcuni valori possibili per c: black, blue, cyan, darkGray, orange, pink, red, yellow, magenta, white. Es. g.setColor(Color.green), dove g e! di tipo Graphics llRect(int x, int y, int width, int height) - disegna un rettangolo e lo riempie con colore selezionato
import java.applet.*; import java.awt.*; public class graca extends Applet {! ! public void init() ! {} ! public void start() ! {} ! public void stop() ! {} ! public void paint(Graphics g) ! { ! ! g.setColor(Color.white); ! ! g.llRect(0, 0, 200, 100); ! ! g.setColor(Color.black); ! ! g.drawString("Questa o e' un", 20, 20); ! ! g.setColor(Color.blue); ! ! g.drawString("applet!", 20, 40); ! } ! public void destroy() ! {} }
La classe MouseAdapter
E! una classe astratta utilizzata per ricevere gli eventi del mouse. Per utilizzarla necessario importare java.awt.event.* Per poter gestire tali eventi necessario denire una sottoclasse di MouseAdapter e ridenire alcuni dei suoi metodi. Tale sottoclasse viene chiamata Ascoltatore.
La classe MouseMotionAdapter
Permette di ricevere e gestire i movimenti del mouse (movimento senza pressione di bottoni, trascinamento) Per poter gestire tali eventi necessario denire una sottoclasse di MouseMotionAdapter e ridenire alcuni dei suoi metodi. Tale sottoclasse viene chiamata Ascoltatore.
eventi che si vogliono gestire (pu essere una sottoclasse di MouseListener oppure una sottoclasse di MouseMotionListener) il metodo addMouseListener oppure addMouseMotionListener a seconda dellascoltatore implementato
Esempio
import java.applet.*; import java.awt.*; import java.awt.event.*; public class EsempioMouse extends Applet { Color c; int base; int altezza; int x; int y; // Ascoltatore per la gestione dei click public class AscoltatoreClick extends MouseAdapter{ public void mousePressed(MouseEvent e) { base=200; altezza=100; c=Color.orange; repaint(); } public void mouseReleased(MouseEvent e) { base=100; altezza=200; c=Color.green; repaint(); } }
Continua...
Esempio
// Ascoltatore per la gestione del trascinamento public class AscoltatoreDrag extends MouseMotionAdapter{ public void mouseDragged(MouseEvent e){ x=e.getX(); y=e.getY(); } } public void init() { c=Color.green; base=100; altezza=200; x=0; y=0; //collega l'ascoltotore per la pressione dei tasti del mouse all'applet addMouseListener(new AscoltatoreClick()); //collega la classe ascoltatore per la gestione dei movimenti del mouse all'applet addMouseMotionListener(new AscoltatoreDrag()); } public void paint(Graphics g){ g.setColor(c); g.llRect(x,y,base,altezza); } }
Metodo getGraphics()
un metodo della classe Applet utilizzato per poter disegnare sul contenitore graco associato senza passare per il metodo paint(Graphics g) (o repaint()). Ritorna l!oggetto della classe Graphics associato all!applet. A differenza di repaint(), una volta invocato non reinizializza il contenitore graco associato.
Per simulare il comportamento di getGraphics() con repaint() ed ottenere un metodo di repaint incrementale, si deve ridenire il metodo update(graphics g) nell!applet nel seguente modo
Es:
Image picture; picture = getImage(getDocumentBase(), "pippo.gif"); getDocumentBase() ritorna il percorso del documento.
Es:
Image picture; picture = getImage(getDocumentBase(), "pippo.gif"); g.drawImage(picture,0,0,this);
Suoni e applet
Per poter riprodurre un suono le formato .au necessario: 1) Caricare il suono desiderato in un oggetto di tipo AudioClip con il metodo: AudioClip getAudioClip(String <percorso suono>, String <nome suono>);
Es:
AudioClip sound; sound = getAudioClip(getDocumentBase(), "sirena.au"); getDocumentBase() ritorna il percorso del documento.
Es: