Sei sulla pagina 1di 165

Universit degli Studi di Pavia

Corso di base in

Programmazione Java
Luigi Santangelo
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 1

Obiettivo

- Il presente corso ha l'obiettivo di presentare i fondamenti di Java - E' un corso prevalentemente pratico, si consiglia pertanto di svolgere regolarmente gli esercizi - Cosa NON faremo: - Librerie Swing e Awt (interfaccia grafica) - Applet - J2EE - J3ME - Librerie specifiche (es. accesso alla base dati)
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 2

Esame

Alla fine del corso previsto (per chi vuole) lo svolgimento di un esame, il cui superamento comporta l'acquisizione di 2 CF. L'esame esclusivamente pratico. Al candidato verr richiesto lo sviluppo di un algoritmo simile a quelli che vedremo a lezione.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Risorse

In rete sono presenti tantissime risorse su Java: www.java.sun.com Java Italian Portal Mokabyte Mattone dopo mattone

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

- capitolo 1 -

Introduzione allo sviluppo del software

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Sviluppo del software


Prima degli anni 90: - Lavoro individuale - Algoritmi veloci - Piccola dimensione dei programmi - Limitata uso di memoria RAM Oggi: - Lavoro in team - Riusabilit del codice - Rendere semplice il mantenimento - Portabilit
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 6

Fasi di sviluppo
modello a cascata

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Linguaggi di programmazione
A s s e m b ly la n g u a g e s

C
L IS P Logo S chem e

C++ Java
P y th o n

C#

1 9 4 0 1 9 5 0 1 9 6 0 1 9 7 0 1 9 8 0 1 9 9 0 2 0 0 0 M a c h in e code F o r tr a n B a s ic P ascal

S m a llta lk S m a llta lk 8 0
8

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Strumenti di lavoro
Editor Il programmatore scrive il codice sorgente Compilatore Traduce il codice sorgente in un codice oggetto (specifico per la CPU) Inteprete Tradue il codice sorgente on the fly

Linker Converte uno o pi moduli in un programma eseguibile Debugger Esegue il programma in slow motion e aiuta a trovare eventuali bug

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Strumenti di lavoro

Sul sito della Sun disponibile un'ottima documentazione navigabile. In essa troverete tutte le informazioni che cercate. Purtroppo solamente in inglese e contiene troppi dettagli che non vedremo. Impareremo a leggere la documentazione e a riconoscere solo ci che ci serve.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

10

Strumenti di lavoro
Per sviluppare gli applicativi in Java sufficiente avere qualsiasi editor di testi di tipo ASCII. Per rendere pi semplice lo sviluppo, consigliato l'utilizzo di un ambiente di sviluppo integrato. Questo ci consente di scrivere codice, compilarlo, eseguire il debug ed eseguirlo. Ci agevola anche la scrittura del codice attraverso suggerimenti. Esistono vari ambienti di sviluppo, alcuni dei quali OpenSource (o comunque free): - Eclispe - Netbeans - Jbuilder - ...
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 11

Java: un approccio ibrido

Un compilatore Java converte codice sorgente Java in istruzioni per JVM. Queste istruzioni, chiamate bytecodes, sono le stesse per ogni architettura e per ogni sistema operativo. Un interprete, specifico per la CPU, interpreta il bytecode in una specifica architettura.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

12

Java: un approccio ibrido

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

13

Java: un approccio ibrido


E d it o r C o m p ile r

H e l lo . ja v a

H e l lo .c la s s

In t e r p r e t e r
H e llo , W o rld !

In t e r p r e t e r

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

14

JDK: Java Development Kit


Cosa serve per programmare in Java? Il Kit di sviluppo (JDK) contiene: - javac: il compilatore; - java: l'interprete; - javadoc: genera documentazione partendo dal codice Java (non la vedremo); - jar: le librerie di sviluppo; - appletviewer: consente di visualizzare le applet senza utilizzare un browser (non lo vedremo) Tutti questi sono tools a riga di comando.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 15

Tipi di programmi
Console application Applet GUI application

Web application (J2EE), Mobile Application (j2ME)


Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 16

Paradigmi di programmazione
Programmazione imperativa: Il codice viene inteso come una sequenza di istruzioni, dette anche direttive o comandi. Rientrano in questa categoria il linguaggio C, Basic, Fortan, Pascal, ... Programmazione funzionale: Il flusso di esecuzione di un programma assume la forma di una serie di funzioni. Rientrano in questa categoria il linguaggio LISP, Logo, Haskell, ...
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 17

Paradigmi di programmazione
Programmazione orientata agli oggetti: La programmazione orientata agli oggetti gestisce oggetti. Ogni oggetto ha una propria vita (viene creato, viene utilizzato e quindi viene distrutto). L'uso di un oggetto avviene attraverso i propri metodi. Ogni metodo pu cambiare lo stato dell'oggetto, spedire un messaggio all'oggetto, o creare un nuovo oggetto (figlio). Un oggetto, inoltre, di uno specifico tipo (classe). Pi oggetti possono far parte della medesima classe ed ereditare le medesime caratteristiche. Java un linguaggio OOP
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 18

- capitolo 2 -

Nozioni fondamentali

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

19

Il linguaggio
Il linguaggio Java composto da uno o pi file di testo, uno dei quali deve necessariamente contenere una classe public con un metodo main: public MiaClasse { public static void main (String args[]) { ... } } Ogni file deve avere lo stesso nome della classe ed estensione .java
20

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Il linguaggio
Considerazioni: - Java case sensitive: distingue le maiuscole dalle minuscole; - Un programma Java vive all'interno di una classe il cui nome deve essere uguale al nome del file e deve inizare con una lettera; - non c' limite alla lunghezza del nome della classe; - Per convenzione il nome della classe inizia con la lettera maiuscola; - Se non sono stati commessi errori sintattici, compilando la classe si ottiene un file .class che il bytecode
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 21

I commenti
Un commento una porzione di codice che verr ignorata durante la fase di compilazione del codice sorgente. Utilissimo per indicare al programmatore la semantica dell'algoritmo che sta realizzando. Un commento pu essere inserito con: // commento in singola linea /* commento su pi linee */
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 22

I commenti

Prendete l'abitudine di commentare i programmi. Partendo dai commenti presenti in un file, possibile, attraverso l'utility javadoc, creare automaticamente la documentazione (in formato html) per le classi create. A tale scopo, i commenti vanno inseriti prima della definizione di ogni classe, di ogni metodo e di ogni attributo.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

23

Le variabili
Una variabile identifica una porzione di memoria RAM in grado di contenere una informazione semplice (tipi primitivi) o composta (oggetti). Il tipo di una varibile specifica la quantit di memoria deve essere riservata per mantenere quella informazione. Tipi primitivi: boolean byte short int long char float double

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

24

Assegnamento
Inizializzare una variabile significa assegnare alla variabile un valore iniziale (che pu essere modificato). La modifica di una variabile avviene attraverso l'operatore di assegnamento (=) int a = 6; In questa istruzione abbiamo dichiarazione e inizializzazione; a = 8; In questa istruzione assegnamo 8 alla variabile a
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 25

Tipi primitivi
boolean char byte short int long float double true o false carattere UNICODE a 16 bit intero di 8 bit [-/+127] intero di 16 bit [-/+32768] intero di 32 bit [+/-2.147.483.648] intero di 64 bit [-/+ 10^19] decimale di 32 bit [+/-3,4*10^38] con 7 cifre significative decimale di 64 bit [+/-3,4*10^308] con 15 cifre significative

float richiede il suffisso F per distinguerlo da double


Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 26

Tipi primitivi: osservazioni


Notate che una stringa NON un tipo primitivo, ma un oggetto. Ne parleremo pi avanti. Due variabili possono essere combinate tra loro SOLO se hanno lo stesso tipo. Ad esempio, due variabili possono essere sommate tra loro solo se hanno lo stesso tipo (ad esempio entrambe int). Se due variabili sono di tipo differente ma devono essere tra loro combinate DEVONO essere convertite nel medesimo tipo (cast). Questa operazione pu essere automatica (fatta dal compilatore) o manuale (fatta dal programmatore)
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 27

Casting
Il cast un processo di conversione (automatico o manuale) di una variabile da un tipo a un altro tipo. Ad esempio, un intero pu essere convertito in un float o in un double, o un intero in una stringa. Alcuni cast avvengono automaticamente, mentre in altre circostanze necessario indicarlo esplicitamente: int a = 5; double b = a; // b vale 5.0 String s = a + ; // s vale 5 char c = 'a'; int d = c; // d = 97 ascii di 'a'
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 28

Casting
Alcuni cast sono lossless (senza perdita di dati). Ad esempio se convertiamo un intero in un double non c' perdita di dati, ma se convertiamo un double in intero, la parte decimale viene persa: double d = 3.14; int i = (int) d; // i vale 3 Di seguito vengono indicati i cast lossless
byte short int char long double

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

29

Cast

int a = 17; int b = 5; System.out.print(a / b); // essendo a e b due interi, la divisione ritorna un intero (ovvero 3); double c = (double) a / (double) b; // c un numero reale

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

30

Nome variabile

Una variabile si pu chiamare come si vuole purche: - non abbia come nome una parola riservata; - sia composta solo da lettere, cifre, _ e $ - non inizi con una cifra; Attenzione: Java case sensitive int Totale = 100; int totale = 100;

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

31

Parole riservate
abstract boolean break byte byvalue case cast catch char class const continue default do double else extends false final finally float for future generic goto if implements import inner instanceof interface long native new null operator outer package private protected public rest return short static super switch synchronized this throw throws transient try var void volatile while int true
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 32

Esempio 01
public class ex01 { public static void main (String args[]) { boolean flag = true; char ch = 'B'; int n = 22; float x = 3.14159F; } } Le variabili di tipo primitivo di definiscono, gli oggetti si istanziano (operatore new, lo vedremo pi avanti).
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 33

Esempio 01

public class ex01 { public static void main (String args[]) { boolean flag = true; char ch = 'B'; int n = 22; float x = 3.14159F; System.out.print(flag); } }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

34

Caratteri speciali

\b \t \n \r \ \' \\

backspace tabulazione avanzamento riga ritorno carrello virgolette doppie virgoletta singola barra rovesciata

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

35

Operatori

Gli operatori in java di distinguono in operatori di: assegnamento: relazionali: aritmetici: logici: incremento decremento = < <= == >= > != + - * / % && || ! ++ --

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

36

Operatori logici

(condiz1 && condiz2) vera se e solo se entrambe le condizioni sono vere. Se la prima falsa, la seconda non viene verificata (corto-circuitata) (condiz1 || condiz2) vera se almeno una delle due condizioni vera. Se la prima vera, la seconda non viene verificata. (corto-circuito) (!condiz1) vera solo se condiz1 falsa.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

37

Esempio 02
public class ex02 { public static void main (String args[]) { int a = 10; int b = 5; int diff = a b; int mod; mod = a % b; System.out.print(diff); System.out.print(mod); } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

38

Controllo del flusso


Come tutti i linguaggi di programmazione, Java supporta i costrutti if, if ... else if (condizione) { codice se condizione vera } else { codice se condizione falsa }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 39

Esempio 03
public class ex03 { public static void main (String args[]) { int a = 10; int resto = a % 2; if (resto == 0) { System.out.print(Numero pari\n); } else { System.out.print(Numero dispari\n); } } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 40

Errori comuni
Extra semicolon: Missing braces:

if (...) ; { statements; ... }


It is safer to always use braces in ifelse

if (...) statement1; statement2; ... if (...) if (...) statement1; else statement2; ...
41

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Controllo del flusso


L'utilizzo di molti if potrebbe compromettere la leggibilit del codice. Per questo potrebbe essere utile utilizzare il costrutto switch (equivalente all'if) switch (variabile da controllare) { case valore1: istruzioni; break; case valore2: istruzioni; break; ... default: istruzioni; break; }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 42

Esempio 04
public class ex04 { public static void main (String args[]) { char carattere = 'a'; switch (carattere) { case 'a': System.out.print(Carattere A);

break;
case 'z': System.out.print(Carattere Z);

break;
default: System.out.print(Non definito); } } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 43

Cicli iterativi

In Java esistono 3 modi per poter eseguire i cicli iterativi: for, while e do ... while I metodo pi semplice il ciclo for con il quale viene indicata la sequenza di istruzioni che devono essere iterate e il numero di volte in cui l'iterazione dovr avvenire. Questo avviene indicando il limite inferiore, il limite superiore di iterazioni e la lunghezza del passo.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

44

Esempio 05

public class ex05 { public static void main (String args[]) { for (int i = 0; i < 10; i = i+1) { System.out.print(Iterazione n. + i); System.out.print(\n); } } }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

45

Cicli iterativi
Talvolta, per, non possibile determinare il numero di iterazioni da fare. Ad esempio, si potrebbe pensare di eseguire un ciclo fintanto che una variabile non assuma il valore 100. In questo caso non sappiamo quando la variabile assuma tale valore. In questo caso preferibile utilizzare i costrutti while e do ... while. La differenza fondamentale sta nel fatto che il ciclo while pu essere eseguito zero volte (se la variabile assume gi il valore 100), mentre il do ... while, viene comunque eseguito una volta. Cio il controllo della condizione avviene DOPO aver eseguito il ciclo.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 46

Esempio 06

public class ex06 { public static void main (String args[]) { int a = 100; while ((a % 2) == 0) a = a / 2; System.out.print(Valore di a: ); System.out.print(a + \n); } }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

47

Esempio 07
public class ex07 { public static void main (String args[]) { float a = 75F; do a = a / 2; while ((a % 2) == 0); System.out.print("Valore di a: "); System.out.print(a + "\n"); // a vale 37.5 } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 48

Metodi
Come abbiamo gi detto, un programma java composto da almeno una classe che contiene un metodo chiamato main. In realt, questa classe potrebbe contenere diversi metodi (o funzioni) che possono essere richiamati da qualsiasi altro metodo. Un metodo prende in input zero, uno o pi parametri (INPUT) e ritorna zero o un parametro (OUTPUT). Bisogna per distinguere la definizione del metodo dalla chiamata al metodo. Un metodo che non ritorna nulla, ritorna void. Il valore di ritorno viene ritornato tramite return. Un metodo pu avere diversi return.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 49

Esempio 08
public class ex08 { public static void main (String args[]) { if (pari(5)) System.out.print(numero pari); else System.out.print(numero dispari); } private static boolean pari(int a) { if ((a % 2) == 0) return true; return false; } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 50

Visibilit (scope)
Ogni variabile che viene definita in un programma Java ha una sua visibilit (scope). Se si cerca di utilizzare una variabile fuore dal suo scope, il compilatore segnala un errore. Le parentesi graffe possono essere utilizzate per capire qual lo scope: public void funzione() { int miavar = 10; .... } // qui finisce la visibilit della variabile
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 51

Visibilit (scope)
Le variabili possono definite dentro un metodo vengono distrutte quando il metodo stato eseguito (quindi lo spazio di memoria viene liberato). private double radius; ... public void function (...) { double radius = 5; ... // le due variabili sono distinte
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 52

Esercizi
1. public static int daysInMonth(int month, int year) // precondizione: 0 < n < 13 // esempio: daysInMonth(2, 2000) ritorna 29 2. public static int numberOfDigits(int n) // esempio: numberOfDigits(1478) ritorna 4 3. public static int sumOfDigits(int n) // esempio: sumOfDigits(1478) ritorna 20 4*. public static int reverseInteger(int n) // esempio: reverseInteger(1234) ritorna 4321

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

53

Ricorsione (solo definizione)


Alcuni problemi si prestano bene ad essere risolti attraverso una tecnica di programmazione definita ricorsione. La ricorsione consiste nel definire una funzione che richiama se stessa ripetutamente (attenzione, se non ben definita pu creare loop infiniti). Alcuni problemi infatti sono di tipo ricorsivo: Fattoriale di un numero Dimensione in byte del contenuto di una directory Massimo comune divisore (Algoritmo di Euclide) Tutte le operazioni di ricerca (tempo logaritmico)
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 54

Pseudocodice e Flowcharts

Pseudocodice: sequenze di asserzioni in una specifica notazione (non legato ad alcun linguaggio di programmazione) FlowCharts (diagrammi di flusso): rappresentazione grafica del flusso

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

55

Esempio: 12 + 22 + ... + n2
Pseudocodice: Input: n sum = 0 i = 1 Ripeti fintanto che i <= n sq = i * i sum = sum + sq i = i + 1 Output: sum
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 56

Esempio: 12 + 22 + ... + n2
n sum 0 i1 No in? Yes sq i * i sum sum + sq ii+1 Input / output Processing step Decision

sum

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

57

Esempio: 12 + 22 + ... + n2
public static void main(String args[]) { int n, sum, i; n = 10; sum = 0; for (i = 1; i <= n; ++i) { int sq = i * i; sum = sum + sq; } System.out.print(sum); }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 58

- capitolo 3 -

Gli oggetti

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

59

Gli oggetti
Java un linguaggio di programmazione orientato agli oggetti. Offre infatti una suite di librerie di oggetti dei quali possibile utilizzare i relativi metodi. Un oggetto rappresenta una istanza di una classe, una entit fisicamente presente in memoria RAM. Preso un oggetto, possibile modificare le propriet attraverso i metodi Le propriet di un oggetto possono essere altri oggetti o variabili di un certo tipo. Attraverso i metodi (funzioni) si possono modificare le propriet degli oggetti.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 60

Gli oggetti
Affinch un oggetto possa esistere, necessario istanziare tale oggetto partendo dalla sua classe. Per cui per avere l'oggetto bisogna avere la classe. Per istanziare un oggetto si utilizza l'operatore new che alloca lo spazio di memoria sufficiente a memorizzare l'oggetto. Object myObj = new Object(); I metodi di un oggetto possono essere invocati nel seguente modo: res = myObj.myMethod(parameter);
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 61

Oggetti
Java mette a disposizione una miriade di oggetti che possono essere istanziati e successivamente utilizzati. Fornisce anche i costrutti affinch possano essere costruiti oggetti nuovi attraverso la definizione della classe a cui gli oggetti appartengono. Tra tutti gli oggetti presenti nelle librerie, ne vedremo solo alcuni. Innanzitutto l'oggetto String. Finora abbiamo lavorato solo con tipi primitivi (int, char, float, ecc) ma non abbiamo parlato di stringhe, in quanto queste in Java sono oggetti.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 62

L'oggetto String
Una stringa una sequenza di caratteri. La classe String contiene pi di 50 metodi. Nel seguito vedremo i pi significativi. Per prima cosa necessario creare l'oggetto di istanza String, quindi successivamene utilizzare i metodi che la classe ci mette a disposizione. Gli esempi che verranno indicati nel seguito ometteranno (per questione di leggibilit) la definizione della classe principale e del metodo main.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

63

Esempio 09
// creazione dell'oggetto String saluto = new String(Ciao); // ritorna 4, la lunghezza della stringa int len = saluto.lenght(); // visualizza la sottostringa ia System.out.print(saluto.substring(1,3)); // visualizza la stringa in maiuscolo System.out.print(saluto.toUpperCase()); // concatenazione System.out.print(Mario + + Rossi);
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 64

Esempio 09
// visualizza la stringa in minuscolo System.out.print(saluto.toLowerCase()); // ritorna il carattere 'C' char c = saluto.charAt(0); // verifica se String a = new String b = new boolean uguali le due stringhe sono uguali String(Ciao); String(Hello); = a.equals(b);

// concatenazione tra stringhe String c = new String(a+b);


Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

65

L'oggetto String
L'oggetto String un oggetto un po' particolare. Per tutti gli oggetti, infatti, la creazione si effettua attraverso l'operatore new (come visto finora). Un oggetto String pu essere creato anche nel seguente modo: String s = Pippo; che equivale a String s = new String(Pippo); Consiglio: abituatevi a scriverlo nel secondo modo.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 66

L'oggetto String

Una stringa pu contenere anche caratteri speciali: \\ per visualizzare \ \n per visualizzare una new line \t per i tab

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

67

L'oggetto String
Un qualsiasi oggetto, e quindi anche un oggetto di classe String, pu, come abbiamo visto nella funzione equals, pu essere passato come parametro all'interno di una funzione (come avviene con i tipi primitivi) ma pu anche essere ritornato da un metodo. Ad esempio il metodo substring ritorna una stringa, sottostringa di quella passata come parametro: String s = new String(Pippo); String ss = s.substring(0,2); // o equiventemente String ss = new String(s.substring(0,2));
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 68

L'oggetto String
Altre funzioni sull'oggetto String: String s = new String(mia stringa); s.length(); // lunghezza di s

s.charAt(2); // terzo carattere s.substring(2, 5); // ritorna 5 caratteri a partire dal secondo s.compareTo(altra_stringa); // confronta le due stringhe
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 69

L'oggetto String
Altre funzioni sull'oggetto String: String s = new String(mia stringa); s.trim(); // elimina gli spazi

s.replace(vecchia, nuova); // sostituisce ogni occorenza di vecchia con nuova s.toUpperCase(); s.toLowerCase();
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 70

L'oggetto String

Conversione intero stringa e stinga intero int i = 5; String s = Integer.toString(i); System.out.print(s + 5); // visualizza 55; String s = new String(5); int i = Integer.parseInt(s); System.out.print(i + 5); // visualizza 10

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

71

Esercizi
1.Scriverelaprocedura: publicint[]contaLettereAlfabeto(StringfraseMoltoLunga); incuilavariabilefraseMoltoLungacontieneunastringaabbastanza lunga(adesempioiprimi10versidellaDivinaCommedia)eritorna unarraydi26elementi.L'iesimoelementodell'arraycontieneil numerodivolteincuilaiesimaletteradell'alfabetofiguranella stringa.Es: nelmezzodelcammindinostravita.... array[0]=3;//perch3sonoleoccorrenzedelcarattereA array[1]=0; //perchnoncisonooccorrenzedelcarattereb array[2]=1; //perchc'unasolaletterac ... array[25]=2;//perch2sonoleoccorrenzedellalettereaz
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 72

Esercizi
5. public static String intToBinary(int n) // esempio: intToBinary(123) ritorna 1111011 6. public static int numeroVocali(String s) // esempio: numeroVocali(pippo) ritorna 2 7. public static String inverti(String s) // esempio: inverti(pippo) ritorna oppip 8*. public static String cifrCesare(String s, int k) // esempio: cifrCesare(abc, 3) ritorna def; // per semplificare si considerino solo i testi minuscoli

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

73

- capitolo 4 -

Gli array e l'input

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

74

Array

Un array un blocco di memoria che contiene valori dello stesso tipo (es tutti intero, tutte stringhe, ecc) Ogni locazione contiene un elemento
1.39 1.69 1.74 0.0

Un array di doubles

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

75

Array

Un array fisicamente una sola variabile anche se contiene diversi elementi. Ogni elemento dell'array viene acceduto attraverso un indice. In informatica gli indici iniziano sempre da zero.
1.39 1.69 1.74 0.0 c[0] c[1] c[2] c[3]

c il nome dell'array
76

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Array

Notate che se un array aventi N elementi, gli indici vanno da 0 a n-1

1.39 1.69 1.74 0.0 c[0] c[1] c[2] c[3]

c il nome dell'array
77

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Array

In Java, quando si crea un array necessario specificare a priori la dimensione di questo array. Questa dimensione NON pu essere modificata successivamente. Se si tenta di accedere a una locazione dell'array inesistente viene generato un'eccezione.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

78

Array

Definizione di un array in Java: Type[] nomeArray = new Type[dimensione]; es. int[] nomeArray = new int[25];

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

79

Array
Perch sono necessari gli array? Supponiamo di avere 1000 variabili di tipo intere e vogliamo calcolare la somma. Scriviamo il codice sia con gli array che senza
int sum = 0; sum = sum + var0001; ... sum = sum + var1000; totale1001righe int n = 1000; int p = new int[n]; int sum = 0; for (int k=0; k<n; k=k+1) somma = somma+p[i]; totale5righe
80

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Gli array
Un array pu essere visto come un oggetto e come tale possiede alcune propriet. Quella pi utilizzata la propriet lenght (non un metodo), che restituisce il numero di elementi di cui si compone l'array:
int a[] = new int[100]; System.out.print(a.lenght); Si fa notare come l'elemento passato al metodo main un array di Stringhe: public static void main(String args[])
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 81

Array

Unarray,comeunqualsiasialtrotipoprimitivo,puessere ritornatodaunmetodo.Es:
public static int[] mioMetodo(int a[]) { int nuovoarray[] = new int[a.length]; .... return nuovoarray; }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

82

Esempio 10

// Dichiarazione di array: int arr1[] = new int[100]; String arr2[] = new String[25]; //accesso arr1[0] = arr1[1] = arr2[0] = arr2[1] = arr3[2] = all'array 101; 202; new String(Pippo); new String(Pluto); new String(Paperino);

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

83

Esempio 11

// Riempire un array di 100 elementi con i primi // 100 numeri interi final int MAX = 100; int array[] = new int[MAX]; for (int i = 0; i < MAX ; ++i) array[i] = i;

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

84

Input di dati
Si visto come con una semplice procedura possibile visualizzare a video il valore delle variabili: System.out.print(Messaggio); Purtroppo per l'input in Java una operazione abbastanza complessa in quanto bisogna utilizzare parecchie classi che sarebbe troppo prematuro vedere. Risulta pertanto pi semplice utilizzare una finestra di input:
JOptionPane.showInputDialog(messaggio);

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

85

Esempio 12

Import javax.swing.*; String nome = JOptionPane.showInputDialog(Il tuo nome); System.out.println(Il tuo nome: + nome); String anni = jOptionPane.showInputDialog(et); int age = Integer.parseInt(anni); System.exit(0);

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

86

Esercizi per casa


1.Utilizzandoilcicloforcreareunprogrammachecalcolail fattorialedin 2.Creareunarraydi10elementi,inizializzarlo(dandovaloria casuali).Scrivereilmetodo publicstaticvoidprint(intarray[]); cheprendel'arrayenevisualizzaglielementi 3.Creareunarraydi10elementi,inizializzarlo(dandovaloria casuali).Scrivereilmetodo publicstaticint[]swap(inta[]); cheprendel'arrayaecreaunnuovoarraybcontenteglistessi elementidiascrittiinordineinverso
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 87

Esercizi

9*.

public static boolean isSorted(int n[])

// ritorna true se n[] ordinato 10. public static int minimo(int n[]) // ritorna l'elemento minimo dell'array 11. public static int media(int n[]) // ritorna la media 12. public static int[] reverse(int a[]) inverte l'ordine degli elementi dell'array

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

88

Esercizi

13. public static int[] concatena(int a[], int b[]) // ritorna un array contenente gli elementi di a e di b 14. public static int[] tally(String s) // ritorna un array contenente il numero di occorrenze // dei 26 caratteri dell'alfabeto presenti in s // per semplicit si trasformi s in minuscolo // NB: ricordarsi di gestire gli spazi e i caratteri speciali

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

89

- capitolo 5 -

Le classi

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

90

Terminologia
Classe: schema dettagliato in base al quale l'oggetto verr creato, definisce le caratteristiche dell'oggetto che appartiene alla classe Oggetto: istanza della classe, l'oggetto possiede la stessa struttura della classe. Rapprenta l'entit attiva Campi: propriet dell'istanza. L'insieme di tutti i campi rappresenta lo stato dell'oggetto Metodi: azioni che l'oggetto pu compiere. I metodi variano lo stato dell'oggetto.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 91

Terminologia
Classe: macchina Oggetto: ferrari

Attributes: String model Color color int numPassengers double amountOfGas

Attributes: model = "Mustang" color = Color.YELLOW numPassengers = 0 amountOfGas = 16.5

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

92

Terminologia
Incapsulamento: i campi di un oggetto sono accessibili SOLO all'oggetto stesso e non da altri oggetti (sia istanza della stessa classe che istanze di classi diverse). Attraverso l'incapsulamento, l'oggetto diventa una scatola nera e per interagire con l'oggetto si devono usare solo i metodi che l'oggetto mette a disposizione Ereditariet: una classe pu ereditare e successivamente estendere le propriet e i metodi di una classe padre
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

93

Terminologia
Event-driven: Il programma simula la gestione asincrona degli eventi. Alcuni metodi possono essere invocati automaticamente in risposta ad alcuni eventi. Costruttori: metodi interni alla classe che consentono la creazione dell'oggetto. Devono essere sempre presenti e quando mancano viene utilizzato il costruttore di default. Il costruttore ha lo stesso nome della classe e viene invocato con new
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 94

Esempio 13
GragorianCalendar compleanno; compleanno = new GregorianCalendar(); // l'operatore new consente di invocare il // costruttore della classe Date. In questo modo // si possono utilizzare i metodi della classe // Date GregorianCalendar oggi; // Non stato creato alcun oggetto (nella RAM // non stato allocato alcuno spazio, per cui // non si possono utilizzare i metodi di Date) compleanno oggi
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 95

GregorianCalendar

Costruzione di classi
Fino a questo momento abbiamo utilizzato delle classi gi esistenti. Java fornisce un set di costrutti che consentono allo sviluppatore di realizzare nuove classi. La forma pi semplice per la definizione di una classe :
class nomeClasse { attributo1 attributoN costruttore1 costruttoreN metodo1 metodoN }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 96

Esempio 14
import java.util.GregorianCalendar; Class Impiegato { private String nome; private String cognome; private String matricola; private GregorianCalendar dataAssunzione; // Costruttore Impiegato(String n, String c, String m) { nome = n; cognome = c; matricola = m; } [...]
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 97

Esempio 14
[...] public String getNominativo() { return nome + + cognome; } public void setAssunzione(int g, int m, int a) { dataAssunzione = new GregoriaCalendar(a,m,g); } public GregorianCalendar() { return dataAssunzione; } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 98

Esempio 14
class esempio14 { public static void main(String args[]) { Impiegato i = new Impiegato(Mario, Rossi, A); Impiegato i2 = new Impiegato(Luca,Bianchi,B); Impiegato i3 = new Impiegato(Alice,Verdi,C); i.setAssunzione(25, 8, 2009); System.out.print(i2.getNominativo()); } }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

99

Osservazioni
- Sono state create DUE classi: la prima (Impiegati) contiene solo la definizione della classe, ovvero gli attributi della classe, i costruttori e i metodi per accedere agli attributi; nella seconda invece si creano gli oggetti di classe Impiegati; - I metodi della classe Impiegati sono pubblici, gli attributi invece privati - Nella classe impiegati stato definito un costruttore (potrebbe essere omesso) - Nella classe impiegati non possono esserci due metodi aventi la stessa firma - Il nome del file della classe Impiegati DEVE essere Impiegati.java - Import della classe GregorianCalendar;
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 100

Esercizi
15. Creare una classe Impiegato in grado di memorizzare il nome, il cognome, la data di nascita (giorno, mese e anno) e lo stipendio annuo (double) di un generico dipendente. Creare almeno un metodo costruttore e i relativi metodi di set e di get degli attributi (i quali dovranno essere privati). Creare anche un metodo public void bonus(double aumento) che aggiunge allo stipendio annuo del dipendente, il bonus passato come parametro. Scrivere quindi un metodo main con il quale viene creato un array di 5 impiegati. Iterare quindi un ciclo in modo da aumentare, a ognuno dei dipendenti, il proprio stipendio del 5%. Infine stampare il nome, il cognome e lo stipendio annuo di ciascuno dipendente, ciascuno su una riga.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 101

Metodi privati
Come abbiamo visto, in una classe gli attributi sono definiti privati, mentre i metodi pubblici. In alcuni casi, per potrebbe essere necessario definire dei metodi accessibili solo all'interno della classe stessa (e quindi non dall'esterno). In questo caso il metodo pu essere definito privato: private String mioMetodo(int d) { ... }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 102

Attributi e metodi static

Un campo (attributo) si dice statico se tutte le istanze di una specifica classe (in cui si definisce il campo statico) condividono lo stesso campo. Di conseguenza, un valore settato in un campo statico, visibile a tutte le istanze di una classe. Lo scope degli attributi su tutta la classe. Un campo statico si definisce con static:
private static int contatore;

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

103

Attributi e metodi static


Un campo si dice statico se tutte le istanze di una specifica classe (in cui si definisce il campo statico) condividono lo stesso campo. Di conseguenza, un valore settato in un campo statico, visibile a tutte le istanze di una classe. Un campo statico si definisce con static:
private static int contatore; Un attributo statico che non varia nel tempo (final) una costante private final static double PI = 3.1415;
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 104

Attributi e metodi static


Anche un metodo pu essere definito static. Un metodo statico pu essere invocato anche senza dover istanziare l'oggetto.
public static int numeroDipendenti() { ... } Si ricorda che il metodo main un metodo statico. Un metodo statico pu solo accedere ai campi statici di una classe
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 105

Attributi e metodi static

La classe Math fornisce moltissimi metodi statici, che possono, di conseguenza, essere utilizzati senza dover istanziare l'oggetto Math per invocarne i suoi metodi:

double d = Math.random(); double p = Math.sqrt(256);

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

106

Esempio 15
class Impiegato { [...] // campo visibile a tutte le istanze // di Impiegato private static int contatore = 0; // costruttore Impiegato([...]) { ++contatore; } public static int getContatore() { return contatore; } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 107

Esempio 15

class Esempio15 { public static { Impiegato a Impiegato b Impiegato c

void main(String args[]) = new Impiegato([...]); = new Impiegato([...]); = new Impiegato([...]);

System.out.print(Impiegato.getContatore); // Non sto utilizzando l'istanza, ma la // classe. Viene visualizzato 3 }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

108

Esercizi
16. Creare una classe CdMusicali in grado di memorizzare informazioni sui CD: artista e titolo del CD. Ogni CD deve essere identificato univocamente, cio ogni CD deve avere un proprio id (numerico) e tutti i CD devono condividere il successivo numero libero (se ho gi creato 4 CD il numero successivo deve essere 5). Costruire i relativi metodi di get e di set. NON costruire il metodo set dell'attributo ID. NON costruire n il metodo SET n il GET del successivo numero libero ma creare un metodo statico che ritorna il numero successivo libero. Infine creare un metodo main che crea 7 CD. Ogni qualvolta viene creato un CD, come id viene assegnato il successivo numero libero, e quest'ultimo deve essere incrementato di 1. Assegnare nome dell'artista e titolo a piacere. Quindi visualizzare i 7 CD.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 109

Overload di metodi
In Java possibile definire una classe contenente pi volte un metodo con lo stesso nome ma parametri differenti. Questo viene definito overload (sovraccarico) del metodo. public class foo { public void metodo() { ... } public void metodo(int par) { ... } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 110

Costruttori
Talvolta si ha necessit di inizializzare gli attributi di una classe ad alcuni valori di default. Il costruttore di una classe serve proprio a definire i valori che dovranno essere assegnati agli attributi della classe. Un costruttore pu anche non essere definito, ma non una buona tecnica di programmazione. Tuttavia, anche per i costruttori possibile eseguire l'overload, in questo modo una classe pu avere diversi metodi costruttori (ognuno di loro avr una firma differente).
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 111

Costruttori
1. Una classe pu avere pi di un costruttore 2. I costruttori devono avere il nome della classe 3. Sono sempre di tipo public 4. Non ritornano alcun tipo 5. Possono prendere parametri 6. Se ci sono pi costruttori, i parametri devono essere differenti; 7. Se non si definisce alcun costruttore, Java ne fornisce uno di default. 8. Un costruttore viene invocato con l'operatore new
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 112

Esempio 16
class Esempio16 { int param; String val; public Esempio16(int a, String s) { param = a; s = val; } public Esempio(int a) { this(a, ); } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 113

Esempio 16/bis

class Esempio16Bis { public static void main(String args[]) { String s; // s vale null s = new String(pippo); // s viene inizializzato e in questo momento // viene allocata la memoria } }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

114

Esercizi
17. Creare una classe Employe composta da tre attributi: un id (di tipo intero), nome (di tipo Stringa) e salario (di tipo intero). Definire quindi un primo metodo costruttore che inizializza solo il nome e un secondo metodo costruttore che inizializza sia il nome che il salario. Nel primo metodo costruttore (quello che inizializza solo il nome), il salario dell'impiegato dovr essere inizializzato a -1. L'attributo id dovr essere un attributo statico e dovr essere incrementato ogni qualvolta viene creato un nuovo oggetto istanza della classe Employe. Per cui i metodi costruttori dovranno prevedere opportunamente l'incremento. Creare un metodo toString() che non prende nessun parametro e ritorna una stringa contenente il nome seguito da : seguito dal salario. Successivamente creare una seconda classe, chiamata e17, che contiene il metodo main dentro al quale viene definito un array di 5 elementi contenente 5 oggetti Employe (inserire nome e salario casuali), quindi visualizzare l'array.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 115

Package
Un package rappresenta un pacchetto di classi. Queste possono essere utilizzare all'interno di una qualsiasi altra classe, purch si specifica il nome del package. Ad esempio, la classe Date, fa parte del package java.util, per cui questo pacchetto dovr essere importato nella nostra classe attraverso la direttiva import: import java.util.*; class miaClasse { ... }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 116

Package
Esistono centinaia di package, quelli che seguono sono alcuni, quelli che verosimilmente vi troverete ad utilizzare nel prosieguo della vostra attivit di programmatori java: java.applet java.awt javax.swing java.net java.text java.math java.lang (applet per il web) (Abstract Window Toolkit) (GUI) (comunicazione in rete) (formattazione di testi) (funzioni matematiche) (package importato di default)
117

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

Incapsulamento
Gli attributi di una classe possono essere tipi primitivi, oppure oggetti istanza di una classe. Gli attributi dovrebbero essere sempre privati. Da una classe B deve essere possibile accedere agli attributi della classe A solo attraverso i metodi pubblici. Questo viene definito incapsulamento. Ad esempio, la classe Impiegati, tra i suoi attributi, pu avere un oggetto di classe GregorianCalendar. In questo caso questo oggetto incapsulato dentro la classe Impiegati.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

118

Incapsulamento

Affinch l'incapsulamento possa essere realizzato, necessario che gli attributi siano privati. L'accesso agli attributi avviene attraverso i metodi pubblici di tipo get e set.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

119

Incapsulamento
public class MyClass { // Private fields: private <sometype> myField; ... // Constructors: public MyClass (...) { ... } Public interface: ... public // Public methods: constructors and public <sometype> myMethod (...) methods { ... } ... // Private methods: private <sometype> myMethod (...) { ... } ... }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 120

- capitolo 6 -

Ereditariet e Polimorfismo

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

121

Ereditariet
Supponiamo di aver gi creato una classe chiamata Impiegato, composta dai campi nominativo e stipendio. Se consideriamo i dirigenti, anch'essi sono sotto alcuni aspetti molto simili agli impiegati (hanno un nome e prendono uno stipendio). Ma possiedono qualcosa di pi, ad esempio un bonus in caso di raggiungimento degli obiettivi. Attraverso l'ereditariet possibile creare una classe Manager che eredit tutte le funzionalit della classe Impiegati e definisce quelle nuove. Class Manager extends Impiegati { ... }Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 122

Ereditariet
La classe Impiegati viene definita superclasse (o classe base, o classe genitore). La classe Manager viene definita sottoclasse (o classe derivata, o classe figlia). Le sottoclassi possiedono pertanto maggiori funzionalit delle superclassi. Tutti i metodi e gli attributi definiti nella superclasse vengono ereditati nella sottoclasse. NON vale il viceversa. possibile nella sottoclasse ridefinire (override) un metodo della superclasse. All'interno della sottoclasse possibile invocare un metodo della superclasse attraverso la parola chiave super.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 123

Esempio 17
class Impiegato { int stipendio; String nominativo; public Impigato(int s, String n) { stipendio = s; nominativo = n; } public int getStipendio() { return stipendio; } public String getNominativo() { return nominativo; } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 124

Esempio 17
class Manager extends Impiegato { int bonus; public Manager(int s, String n, int b) { super(s, n); bonus = b; } public int getStipendio() { // return stipendio + bonus; // ERRORE return super.getStipendio() + bonus; } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 125

Esempio 17
class Esempio17 { public static void main(String arg[]) { Impiegato i = new Impiegato(25000, pippo); Manager m = new Manager(35000, pluto, 15000); System.out.print(i.getNominativo() + ); System.out.println(i.getStipendio()); // ritorna 25000 System.out.print(m.getNominativo() + ); System.out.println(m.getStipendio()); // ritorna 50000 }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 126

Polimorfismo

Continuiamo con l'esempio di prima: Impiegati e Manager. Abbiamo detto che la classe Manager estende la classe Impiegato. Questo significa che un oggetto istanza della classe Manager anche istanza della classe Impiegato (anche nella vita pratica un manager pur sempre un impiegato). Il fatto che un oggetto pu essere istanza di due classi differenti viene definito polimorfismo. L'esempio seguente chiarir i dubbi:

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

127

Esempio 18
class Esempio18 { public static void main(String arg[]) { Impiegato dip[] = new Impiegato[4]; dip[0] dip[1] dip[2] dip[3] = = = = new new new new Impiegato(Carl, 15000); Manager(Tom, 35000, 12000); Impiegato(Bob, 22000); Manager(Harry, 29000, 15000);

for (int i = 0; i < 4; ++i) { System.out.print(dip[i].getNominativo()+ ); System.out.println(dip[i].getSalario()); } }


Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 128

Polimorfismo

Nell'istruzione seguente
System.out.println(dip[i].getSalario());

la VM invoca dinamicamente il metodo getSalario a seconda di chi sia dip[i], cio a seconda che dip [i] sia istanza di Impiegato o sia istanza di Manager. La selezione automatica del metodo appropriato durante l'esecuzione viene chiamata binding dinamico

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

129

Classi e metodi final


Talvolta si pu aver necessit di impedire che una classe venga ereditata. Cio se A una classe di tipo final, non possibile creare B che estende A. In questo caso, in fase di compilazione verr generato l'errore. La stessa cosa, accade con i metodi final. Es: class A { public final int test() { ... } } Class B extend A { // B non pu definire il metodo test. }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 130

Classi Astratte
Una classe si dice astratta quando contiene uno o pi metodi astratti. Un metodo astratto quando tale medoto viene solo definito e non implementato. Spetta alla classe che estende la classe astratta implementare i metodi astratti. Una classe astratta non pu mai essere istanziata, cio NON possibile creare un oggetto istanza di una classe astratta. ClasseAstratta a = new ClasseAstratta(); // impossibile
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 131

Esempio 19

Nell'esempiocheseguecreeremounaclassePersonastratta,nellaqualeviene definitomanonimplementatoilmetodogetDescrizione,quindicreeremo altredueclassi(ImpiegatoeStudente)cheereditanolaclassePersonequindi implementanoilmetodoastratto.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

132

Esempio 19

abstract class Person { private String name; public Person(String n) { name = n; }

Metodo astratto non definito

public abstract String getDescription(); public String getName() { return name; } }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

133

Esempio 19
class Impiegato extends Person { private double stipendio; public Impiegato(String n, double s) { super(n); stipendio = s; } public double getStipendio() { return stipendio; } public String getDescrizione() { return L'impiegato + super.getNome() + guadagna + stipendio + euro; } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 134

Esempio 19
class Studente extends Person { private String facolta; public Studente(String n, String f) { super(n); facolta = f; } public double getFacolta() { return facolta; } public String getDescrizione() { return Lo studente + super.getNome() + iscritto alla facolt di + facolta; } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 135

Esempio 19
Notare: stato creato un class Esempio19 { array di due elementi public static void main(String args[]) { Person people[] = new Person[2]; people[0] = new People(Pippo); //ERRORE // non si pu istanziare una classe astratta people[0] = new Impiegato(Pluto, 15000); people[1] = new Studente(Paperino, lettere); for (int i = 0; i < people.length; i++) { Person p = people[i]; System.out.println(p.getDescrizione()); } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 136

Attributi protected e public


Nel metodo getDescrizione della classe Impiegato, per visualizzare il nome del dipendente utilizza il metodo getNome(). Perch non pu utilizzare l'attributo nome? L'attributo nome un attributo della classe Person (superclasse), essendo privato, diventa inaccessibile alle sottoclassi. Come fare per renderlo accessibile? Si pu definire l'attributo come protected. Un attributo protected un attributo che pu essere acceduto SOLO dalla sottoclassi. Un attributo pu anche essere public e in questo caso accessibile a tutti. Se non viene definito nulla visibile a livello di package.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 137

Attributi protected e public

IMPORTANTE: per privilegiare l'incapsulamento dei dati necessario che gli attributi siano sembre privati e i metodi pubblici.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

138

Suggerimenti

Quando si scrivono i programmi e si vuole utilizzare l'ereditariet, tenete presente questi suggerimenti: 1. Inserire le operazioni e i metodi comuni nella superclasse; 2. Non utilizzare campi protected; 3. Utilizzare l'ereditariet solo se tutti i metodi ereditati hanno senso;

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

139

L'operatore instanceof
Alcune volte pu essere necessario individuare la natura (intesa come classe) di un oggetto. L'operatore instanzeof pu essere utilizzato a tale scopo:
Person p[] = new Person[2]; p[0] = new Impiegato(...); p[1] = new Dirigente(...); for (int i = 0; i < p.length; ++i) { if (p[1] instanceof Impiegato) ... else .... }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 140

Object: la superclasse cosmica


Ogni qualvolta creiamo una classe, anche se questa NON estende alcuna classe, in realt, estende implicitamente una superclasse: Object. La classe Object definisce alcune metodi amministrativi, ovvero di gestione della classe. per questo che quando, attraverso l'operatore . in Eclipse, vedete l'elenco dei metodi di un oggetto, vi appaiono metodi che voi non avete mai definito nella classe.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

141

Object: la superclasse cosmica

Quali sono i metodi che vengono forniti dalla classe Object? equals() : verifica se due oggetti uguali getClass(): ritorna il nome della classe di cui l'oggetto istanza Potrebbe essere necessario eseguire una sovrascrittura di questi metodi

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

142

Metodo equals()
Impiegato a = new Impiegato(pippo, 15000); Impiegato b = new Impiegato(pippo, 15000); if (a == b) system.out.print(identici); else system.out.print(differenti); Cosa verr stampato a video? Sebbene i due oggetti contengano le stesse informazioni, l'operatore di uguaglianza verifica solo se l'indirizzo di memoria uguale. Per cui, essendo due oggetti separati, avranno differente indirizzo di memoria e quindi differenti [...]
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 143

Metodo equals()
Quando si devono confrontare due oggetti, necessario ricorrere al metodo equals(). Poich ogni classe estende di default la classe Object, possiede gi un metodo equals il quale per verifica SOLO se il contenuto nella cella di memoria identico per cui, riferendoci all'esempio di prima, l'istruzione if (a.equals(b)) system.out.print(identici); else system.out.print(differenti); visualizzer sempre la parola differenti. Bisogna quindi sovrascrivere il metodo equals() nel modo seguente:
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 144

Metodo equals()

public boolean equals(Impiegato i) { if (this.getNome().equals(i.getNome)) && this.getStipendio() == i.getStipendio()) return true; return false; }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

145

Metodo getClass()

Il metodo getClass della classe Object ritorna un oggetto Class che rappresenta la classe di cui l'oggetto istanza: Impiegato i = new Impiegato(...); Class c = i.getClass(); System.out.print(c.getName()); viene visualizzato il nome della classe dell'oggetto i.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

146

- capitolo 7 -

Interfacce

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

147

Ereditariet multipla
Alcuni linguaggi di programmazione (ad esempio il C++) consentono ad una classe di ereditare metodi e attributi da pi superclassi (ereditariet multipla). In Java non esiste un concetto analogo: una classe pu ereditare metodi e attributi da una sola superclasse. Una classe in Java per pu implementare una o pi interfaccia. Una interfaccia una classe in cui i metodi non sono definiti. Una classe che implementa una interfaccia (o pi interfacce) deve necessariamente implementare TUTTI i metodi delle interfacce. Di conseguenza una interfaccia non pu essere istanziata.
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 148

Interfacce

DanceFloor DanceGroup ControlPanel Band Dancer


Interface

Aerobics Waltz Rumba Cha-ChaCha Salsa

Dance

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

149

Esempio 20
public interface Dance { public int getTempo(); public getBeat(int i); } public class Waltzer implements Dance { public int getTempo() {return 750; } ... }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

150

Interfacce fornite dal jdk

Le librerie di Java forniscono, tra le altre cose, un set di interfacce che possono essere utilizzare per creare delle classi che implementano i metodi definiti nelle interfacce. Tra queste prendiamo in esame l'interfaccia Cloneable. Per prima cosa definiamo il concetto di clonazione:

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

151

Metodo clone()
Supponiamo di avere il seguente codice: Impiegato a = new Impiegato(pippo, 15000); Impiegato b = a; a.setNome(pluto); System.out.print(b.getNome()); Cosa verr visualizzato a video?

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

152

Metodo clone()

a b

IMPIEGATO
Nome = pippo salario = 15000

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

153

Metodo clone()
Quando si devono creare cloni di un oggetto opportuno creare un metodo clone che esegue la clonazione. Supponiamo di aver definito tale metodo per la classe Impiegato, si avr che: Impiegato a = new Impiegato(pippo, 15000); Impiegato b = (Impiegato) a.clone(); a.setStipendio(25000); System.out.print(b.getStipendio());
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

154

Metodo clone()
a

IMPIEGATO
Nome = pippo salario = 15000

IMPIEGATO
Nome = pippo salario = 15000

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

155

Metodo clone()
Per creare il metodo clone, opportuno che la classe Impiegati implementa l'interfaccia Cloneable. Questa interfaccia definisce (ma non implementa) il metodo clone che verr definito nella classe Impiegati:
class Impiegati implements Cloneable { ... public Object clone() { [ vedi pagina seguente ] } }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 156

Metodo clone()

... public Object clone() { Impiegato i = new Impiegato(this.getNome(), stipendio); return i; } ...

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

157

Metodo clone()
Problema: cosa succede quando si clona un oggetto che possiede, tra i suoi attributi, degli altri oggetti (incapsulamento)? Supponiamo che la classe Impiegati abbia, tra i suoi attributi, un attributo istanza della classe GregorianCalendar (data assunzione):
Impiegati a = new Impiegati(pippo, 21/06/2004); Impiegati b = (Impiegato) a.clone(); a.setDataAssunzione(22/06/2004);

quale sar la data di assunzione di b?


Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 158

Metodo clone()

IMPIEGATO
Nome = pippo Nome = pippo salario = 15000 salario = 15000 assun =

GregorianCalendar

IMPIEGATO
Nome = pippo Nome = pippo salario = 15000 salario = 15000 assun =

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

159

Metodo clone()

In questi casi necessario dover clonare anche gli oggetti incapsulati:


public Object clone() { Impiegato i = new Impiegato(this.getNome(), stipendio); i.setDataAssuzione(dataAssunzione.clone()); return i; }

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

160

- capitolo 8 -

Eccezioni

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

161

Classificazione
Una eccezione un errore che si manifesta durante l'esecuzione di un programma. Esistono due macroaree di eccezioni: - RuntimeException (cast difettoso, accesso ad array fuori dai limiti, puntatore nullo); - IOException (lettura di un file vuoto, apertura URL errato); Bisogna cercare di intercettare qeuste eccezioni e agire di conseguenza.

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

162

Lancio di eccezioni
I metodi possono lanciare eccezioni, ma necessario definire il tipo di eccezione lanciata: public String readLine() throws IOException In questo esempio, la funzione readLine ritorna una stringa ma pu anche generare una eccezione di tipo IOException All'interno della procedura, l'eccezione viene lanciata con la parola chiave throw Vedi esempio seguente:

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

163

Esempio 21
public interface interfaccia1 { public void metodo1(); } public interface interfaccia2 { public void metodo2(); } public class miaClasse implements interfaccia1, interfaccia2 { // la classe DEVE implementare i metodi delle due interf. }
Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia 164

Luigi Santangelo Biennio formativo 2009-2010 Universit degli Studi di Pavia

165