Laboratorio di reti I: Java
Stefano Brocchi
[email protected]
13 ottobre, 2009
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
1 / 27
In queste slide
Concetti di programmazione a oggetti
Tipi, polimorfismo e casting
Strutture dati e classi utili forniti da Java
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
2 / 27
Tipi, polimorfismo e casting
Oggetti
In Java tutto ciò che non sia un tipo di base (intero, booleano...) è
un oggetto
Il tipo di un oggetto è definito da una classe
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
3 / 27
Tipi, polimorfismo e casting
Oggetti e ruoli
Nel definire una classe, è utile cercare di definire un oggetto che sia
indipendente dal contesto in cui viene utilizzato
Assegnare ad ogni oggetto un ruolo ben preciso e limitare le
operazioni svolte dall’oggetto ai compiti di cui è responsabile
In questo modo è molto più facile controllare la correttezza delle
operazioni svolte dall’oggetto
Inoltre si garantisce cosı̀ la riusabilità del codice, una più semplice
suddivisione del lavoro tra vari componenti di un gruppo ed una facile
estendibilità del progetto
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
4 / 27
Tipi, polimorfismo e casting
Campi privati, protetti e pubblici
Un oggetto contiene un insieme di metodi rappresentanti ciò che
l’oggetto può fare, e una serie di attributi (anche detti campi o
proprietà)
I campi possono essere
Privati: l’accesso è consentito solo ai metodi della classe stessa
Protetti: l’accesso è consentito ai metodi della classe e delle classi che
lo estendono
Pubblici: l’accesso può essere fatto liberamente
I campi di un oggetto devono solitamente essere tutti privati in modo
da avere un maggiore controllo sul loro accesso
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
5 / 27
Tipi, polimorfismo e casting
Campi statici
Un campo può essere inoltre dichiarato come statico
In questo caso la variabile associata sarà globale e non collegata ad
una singola istanza
Sempre per ottenere un maggiore controllo sulla modifica di una
variabile, è opportuno evitare di utilizzare campi statici
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
6 / 27
Tipi, polimorfismo e casting
Estendibilità
Per l’estendibilità, ogni classe deriva da un’altra
Es. public class classeFiglia extends classePadre
Gli oggetti della classe figlia saranno considerati come un caso
particolare di quelli della classe padre
La classe figlia dovrà avere tutte le funzionalità della classe padre, più
eventualmente delle funzionalità aggiuntive
Ogni contesto che richiede un oggetto della classe padre accetterà
anche oggetti della classe figlia
Tutti gli oggetti derivano da Object
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
7 / 27
Tipi, polimorfismo e casting
Estendibilità e polimorfismo
Vediamo come un oggetto possa essere sostituito ad un altro meno
generico
Consideriamo i metodi
public void metodo1(Object o)
public void metodo2(mioOggetto o)
Il seguente codice è corretto...
mioOggetto mo = new mioOggetto();
metodo1(mo);
...mentre il seguente da un errore in compilazione
Object o = new Object();
metodo2(o);
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
8 / 27
Tipi, polimorfismo e casting
Downcast
Se si è sicuri che a run time un oggetto sia di un certo tipo, ma il
nome della variabile che lo referenzia è di un sovrattipo, si può
eseguire un downcast
Object o = new mioOggetto();
// metodo2(o);
// Errore di compilazione
metodo2( (mioOggetto) o ); // Ok
Se viene eseguito un downcast di un oggetto ad un tipo che non
corrisponde con il suo, viene generata un’eccezione a runtime
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
9 / 27
Tipi, polimorfismo e casting
Tipi di base
Tipi di base
In Java sono definiti dei tipi di base, come int, long, char, byte
Questi non sono considerati oggetti, ma in alcuni casi può essere
necessario considerarli come tali
Esistono per questo delle classi equivalenti che fanno da contenitore
per questi valori, come
Integer
Long
Byte
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
10 / 27
Tipi, polimorfismo e casting
Tipi di base
Oggetti per tipi di base
Si può creare uno di questi oggetti dal tipo corrispondente tramite il
costruttore
Es.
Integer i = new Integer(3);
Esistono poi i metodi per poter eseguire l’operazione inversa ed
ottenere la variabile originale
Es.
int i2 = i.intValue();
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
11 / 27
Tipi, polimorfismo e casting
Tipi di base
Conversioni fra tipi
In queste classi sono presenti anche diversi metodi per la conversione
tra tipi
Il metodo parseInt di Integer per esempio effettua la conversione
tramite parsing da una stringa a un intero
int i = Integer.parseInt("3");
Similarmente si possono usare i metodi parseFloat di Float,
parseByte di Byte...
Il modo più semplice per convertire numeri a una stringa è invece
tramite l’operatore di somma:
int i = 3;
String s = "" + i;
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
12 / 27
Strutture dati fornite con Java
Risorse disponibili in Java
In Java sono messe a disposizione numerose classi utili
Solitamente quando si vuole utilizzare una struttura dati o un
algoritmo molto noto, è opportuno aspettarsi che questo sia già
implementato
Ciò è reso possibile dalle qualità della programmazione a oggetti come
la riusabilità del codice
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
13 / 27
Strutture dati fornite con Java
Risorse disponibili in Java
Alcune operazioni e strutture dati disponibili in Java sono:
Vettori dinamici
Liste
Stack e code
Tabelle hash
Ricerca su stringhe
Operazioni matematiche (trigonometria, logaritmi e potenze,
arrotondamenti, generazione casuale...)
Ricerca su stringhe
Parsing di una stringa
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
14 / 27
Strutture dati fornite con Java
Uso di classi preesistenti
Per questo programmando in Java è importante saper sfruttare le
risorse a disposizione
Prima di implementare da zero una struttura dati controllare cosa c’è
a disposizione
Tenere sempre presente la documentazione Java
http://java.sun.com/javase/6/docs/
http://java.sun.com/javase/6/docs/api/index.html
Vedremo alcune delle classi per le strutture citate
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
15 / 27
Strutture dati fornite con Java
Classe Vector
Classe Vector
La classe java.util.Vector rappresenta un vettore dinamico
Come molte altre classi per strutture dati, predisposta per gestire
oggetti di tipo Object
In questo modo qualsiasi oggetto può essere inserito in un Vector
Necessario riconvertire l’oggetto, al momento dell’estrazione, al tipo
originale
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
16 / 27
Strutture dati fornite con Java
Classe Vector
Metodi di Vector
Un oggetto Vector può essere creato tramite il costruttore vuoto
Si può usare il metodo add per aggiungere un elemento in fondo al
vettore, le cui dimensioni verranno incrementate automaticamente
public boolean add(Object o)
Metodi per l’impostazione, l’estrazione e la rimozione di un oggetto
da una determinata posizione:
public Object set(int index, Object o)
public Object get(int index)
public Object remove(int index)
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
17 / 27
Strutture dati fornite con Java
Classe Vector
Uso di Vector
Vediamo un esempio di uso di Vector
Vector v = new Vector();
int i = 5;
v.add(new Integer(i));
Object o = v.get(0);
Integer in = (Integer)o;
int i2 = in.intValue();
v.add(new Integer(7));
int i3 = ((Integer)(v.get(1))).intValue();
Stefano Brocchi
Laboratorio di reti I: Java
// 5
// 7
13 ottobre, 2009
18 / 27
Strutture dati fornite con Java
Classe Vector
Uso di Vector
Se si vogliono inserire degli elementi in un Vector non ordinatamente,
si possono impostare le dimensioni tramite setSize(int newsize)
Vector v = new Vector();
v.setSize(10);
// Creati indici da 0 a 9
v.set(8, "test");
v.add("bla");
// Aggiunto indice 10
System.out.println(v.get(10));
// Output: bla
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
19 / 27
Strutture dati fornite con Java
Classe Vector
Altre funzionalità di Vector
Numerosi altri metodi in Vector comprendono funzionalità per
Gestione delle dimensioni di un vettore
Ricerca di un elemento
Aggiunta e rimozione di gruppi di elementi
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
20 / 27
Strutture dati fornite con Java
Classe Stack
Classe Stack
La classe java.util.Stack rappresenta uno stack
Metodi per l’inserimento e la rimozione di un elemento in cima alla
pila:
public Object push(Object o)
public Object pop()
Esistono inoltre metodi per il controllo delle dimensioni dello stack:
public int size()
public boolean isEmpty()
Inoltre la classe Stack estende Vector, e quindi offre anche tutti i
metodi di questa classe
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
21 / 27
Strutture dati fornite con Java
Classe LinkedList
Classe LinkedList
La classe java.util.LinkedList rappresenta una lista
Contiene metodi per l’inserimento e la rimozione di un oggetto in
testa alla lista come
addFirst(Object o), removeFirst()
... o per inserire e rimuovere dal fondo della lista
addLast(Object o), removeLast()
Possibile ottenere la dimensione della lista tramite size()
Può essere facilmente utilizzata in funzione di pila o di coda
A disposizione diverse altre funzionalità come l’inserimento o la
rimozione in un determinato punto o la ricerca di un dato elemento
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
22 / 27
Strutture dati fornite con Java
Classe Hashtable
Classe Hashtable
La classe java.util.Hashtable rappresenta una tabella hash
La chiave della tabella è rappresentata dal codice hash di un oggetto
passato
I metodi per l’inserimento, l’estrazione e la rimozione sono
public Object put(Object key, Object value)
public Object get(Object key)
public Object remove(Object key)
Per ottenere il codice hash di un oggetto viene chiamato il metodo
hashcode
Il metodo è definito in Object ed è quindi presente in ogni oggetto
Se ritenuto opportuno, il metodo può venir riscritto per ottenere codici
hash migliori
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
23 / 27
Strutture dati fornite con Java
Classe Hashtable
Hashtable e vettori associativi
La classe Hashtable può essere comoda anche per creare dei vettori
associativi. Ad esempio:
Hashtable passwords = new Hashtable();
passwords.put("marco", "lkjhgf");
passwords.put("luca", "qwerty");
System.out.println("Password di Luca: " +
passwords.get("luca"));
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
24 / 27
Strutture dati fornite con Java
Classe StringTokenizer
Classe StringTokenizer
Un’altra classe utile è java.util.StringTokenizer, che permette
di spezzare una stringa in più parti a seconda di un dato delimitatore
Un esempio: suddividere ”uno,due,tre” in ”uno”, ”due” e ”tre”
Richiede come argomenti del costruttore la stringa da dividere ed i
caratteri che fanno da delimitatori
Il metodo nextToken() restituisce una parte della stringa e passa alla
successiva
Il metodo hasMoreElements() controlla se ci sono ancora elementi
da scorrere
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
25 / 27
Strutture dati fornite con Java
Classe StringTokenizer
Uso di StringTokenizer
Un esempio dell’uso di StringTokenizer:
StringTokenizer st = new StringTokenizer(
"Una_stringa_di_prova", "_");
while (st.hasMoreElements()) {
System.out.print(st.nextToken() + " ");
}
// Output:
Una stringa di prova
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
26 / 27
Strutture dati fornite con Java
Alcune funzionalità della classe String
Alcune funzionalità della classe String
Per quanto riguarda la manipolazione delle stringhe, vari metodi utili
si possono trovare nella classe String per vari utilizzi:
Estrazione o ricerca di una sottostringa - substring, indexOf
Corrispondenza con un’espressione regolare - matches
Manipolazione maiuscole e minuscole - toUpperCase,
toLowerCase, equalsIgnoreCase
Rimpiazzamento di un carattere con un altro - replace,
replaceAll
Confronto alfabetico - compareTo, compareToIgnoreCase
Stefano Brocchi
Laboratorio di reti I: Java
13 ottobre, 2009
27 / 27