Introduzione a Java
Si ringraziano Massimiliano Curcio e Matteo Giacalone
1: Introduction
1
Riferimenti
!
!
!
Java tutorial: http://java.sun.com/docs/books/tutorial/
Il Java tutorial è parte di una più ampia
documentazione disponibile al sito Sun
J. Bishop: Java gently – Corso introduttivo.
Addison - Wesley
!
P. Niemeyer e altri. Learning Java. O'REILLY
!
D. Flanagan. Java in a nutshell. O'REILLY
!
M. Hughes e altri. Java network programming, 2nd
edition. Manning
1: Introduction
2
Parte I: Cos’è Java
!
!
!
!
!
Generalità sul
linguaggio
Come è fatto un
programma Java
(Helloworld.java)
Come si compila un
programma Java
Tipi primitivi in Java
Osservazioni:
!
!
!
Costrutti del
linguaggio
Si assume la conoscenza dei
concetti della programmazione
orientata agli oggetti sviluppati
nei corsi del II anno
Molti argomenti non saranno
trattati: Swing, AWT, RMI,
applet, ecc.
Altri argomenti saranno toccati
quando necessario e andranno
approfinditi dallo studente (es.
classi che gestiscono liste
1: Introduction
3
Generalità su Java
!
Linguaggio OO sviluppato dalla Sun Microsystems
!
Obiettivi:
µ
µ
Max. portabilità
Semplicità nella gestione di aspetti complessi ma frequenti nelle
applicazioni:
• Interfacce grafiche
• Programmazione di rete
• Programmazione concorrente
………
!
Simile al C++, ma con alcune differenze importanti
!
Gestione trasparente (o quasi) della memoria dinamica
µ
Non va allocata esplicitamente
µ
Non esiste un tipo esplicito puntatore
µ
In realtà l’accesso agli oggetti avviene per riferimento
1: Introduction
4
Perché Java è “portabile”
!
Java è sia compilato che
interpretato
µ
µ
Codice
sorgente
Il codice sorgente è
compilato in un codice
binario (byte code)
indipendente dalla
piattaforma
Il codice binario è
interpretato a runtime da
un interprete (Java Virtual
Machine) che traduce
istruzioni byte code in
istruzioni della piattaforma
reale
Compilatore
Byte
code
Interprete
Linux
Interprete
Interprete
Mac
Win
1: Introduction
5
La piattaforma Java (rif.: Java Tutorial)
!
Java non consiste solamente del compilatore, ma
include una vera piattaforma:
µ
µ
!
Interprete (JVM) – dipende dal Sistema Operativo,
implementa una macchina virtuale
Insieme di API (Application Programming Interface) per la
macchina virtuale
API: insieme di librerie di classi Java predefinite,
raggruppate in Package. Offrono numerosi
strumenti:
µ
I/O di base
µ
Supporto alla programmazione di rete
µ
Supporto per la creazione di interfacce complesse
µ
Tipi di dati complessi (liste, vettori, ecc.)
1: Introduction
6
Come è fatto un programma
Java
!
!
Insieme di classi
Come in C++, esiste
una classe che
implementa il metodo
main() e costituisce il
punto di ingresso del
programma
import java.io.*
/* Importo il package che contiene le classi
per la gestione dell’ I/O */
public class primaClasse {
public static void main(String args[]) {
System.out.println(“Hello world!!”);
}
} /* Fine della classe */
1: Introduction
7
Come è fatto un programma
Java/2
!
“import”: permette di usare i nomi brevi per tutte le classi del
package specificato
µ
µ
!
!
Es. (con import java.io.*): System.out.println(“pippo”) invece di
java.io.System.out.println(“pippo”)
Dettagli più avanti
main() deve essere dichiarato public static void e ha come
argomento un vettore di stringhe
Stesse convenzioni del C/C++:
µ
/* Commenti */
µ
Uso delle parentesi
µ
Operatori (quasi tutti)
µ
Punteggiatura
µ
Case sensitive!!
1: Introduction
8
Scrittura e compilazione di
programmi (rif.: Java Tutorial)
!
!
Un programma Java è costituito da un insieme di
classi, di cui una contenente il metodo main()
File e classi
µ
1 file .java per ogni classe pubblica
• Es.: pippo.java per la classe pubblica pippo
• Attenzione: possono aversi più classi in un file, ma solo una di esse può
essere pubblica
µ
!
Per la classe pubblica pippo il nome del file deve essere pippo.java
Per eseguire un programma Java servono (almeno):
µ
Compilatore Java
µ
Interprete Java (JVM)
1: Introduction
9
Scrittura e compilazione di
programmi/2
! JDK (Java Development Kit)
µ
Si può scaricare dal sito della SUN (http://java.sun.com/products/jdk)
µ
Contiene compilatore (javac) e interprete (java)
µ
Il codice sorgente si può scrivere con qualsiasi editor di testo
! Ambienti di sviluppo più complessi
µ
µ
Esistono strumenti (ad esempio JBuilder e JCreator) che
permettono di integrare i vari strumenti, offrendo
un’interfaccia più “amichevole
Richiedono la presenza di JDK
! Esistono versioni successive del JDK (perché
Java evolve tuttora)
1: Introduction
10
Scrittura e compilazione di
programmi/3
1. Scrittura (es.: file pippo.java in c:\\varie)
2. Compilazione
1.
Cambiare directory in modo da trovarsi in quella contenente il
file (c:\\varie )
2.
Avviare la compilazione: javac pippo.java (non dimenticare
l’estensione)
3.
Si ottiene così il codice oggetto (byte code). Il file
corrispondente ha lo stesso nome ma estensione “class”.
Dunque, nel nostro caso pippo.class
3. Esecuzione
1.
Accertarsi di essere nella directory contenente il file .class
2.
Avviare l’esecuzione: java pippo (stavolta senza estensione)
Nota: gli ambienti di sviluppo come JBuilder fanno
le
1: Introduction
stesse cose, ma in modo trasparente
11
Tipi di dato primitivi
!
boolean: assume valori true
o false
!
int: intero a 32 bit in
complemento a 2
!
byte: intero a 8 bit in
complemento a 2
!
short: intero a 16 bit in
complemento a 2
!
long: intero a 64 bit in
complemento a 2
!
char: carattere
rappresentato in formato
Unicode a 16 bit
!
float (32 bit)
!
double (64 bit)
!
!
!
!
Esiste una classe predefinita
corrispondente a ognuno dei tipi
primitivi (es.: Int per int, Char
per char ecc.)
La dichiarazione delle variabili
segue le stesse convenzioni
C/C++
Una variabile locale a un metodo
deve essere esplicitamente
inizializzata prima dell uso
Le variabili di classe possono
non essere inizializzate, nel qual
caso sono poste a valori di
12
1: Introduction
default
Costrutti
!
if - else
!
while
!
do - while
!
switch
!
for
!
try – catch - finally
!
!
!
!
La sintassi e la semantica
sono sotanzialmente le
stesse del C/C++
Si illustreranno
soprattutto le (poche)
differenze
Attenzione al costrutto
try – catch – finally
Blocco di codice: sequenza
di istruzioni semplici o
complesse racchiuso tra
parentesi graffe
1: Introduction
13
Costrutti/2
if (<condizione>) {
<istruzione>;
<istruzione>;
............
}
oppure:
if (<condizione>) {
<istruzione>;
<istruzione>;
............
}
else {
<istruzione>;
<istruzione>;
...........
}
!
!
A differenza del C/C++
<condizione> deve
essere un’espressione
che restituisce un
valore booleano
Es.: (i==0) oppure bool,
purché bool sia una
variabile booleana
1: Introduction
14
Costrutti/3
while (<condizione>) {
<istruzione>;
<istruzione>;
............
}
switch(n) {
case 1:
<Blocco istruzioni 1>
break;
case 2:
<Blocco istruzioni 1>
break;
default:
<Blocco istruzioni default>
break;
}
do {
<istruzione>;
<istruzione>;
............
}
while (<condizione>)
!
!
n deve essere un’espressione (o una
variabile) a valore di tipo int, byte,
char o short
n non può essere di tipo long
1: Introduction
15
Costrutti/4
for (int i = 1, j = 10; i < j; i += 3, j++) {
<istruzione>;
<istruzione>;
............
}
!
!
!
try – catch – finally è
usato per gestire le
eccezioni
Dettagli più avanti
L’operatore “,” non
esiste in Java, tranne
che nel costrutto for,
dove funziona come in
C/C++
1: Introduction
16
Operatori ed espressioni
!
!
!
Esistono quasi tutti gli operatori C, più alcuni
operatori nuovi
Operatori mancanti:
µ
Operatore “,” (tranne nel costrutto for)
µ
“*” e “&”, poiché non si ha gestione esplicita dei puntatori
µ
sizeof()
Nuovi operatori:
µ
“+” sovraccarico, può essere usato per concatenare stringhe
µ
“>>”: shift aritmetico a destra con estensione del segno
µ
“>>>”: shift aritmetico a destra senza estensione del segno
µ
“new” ha lo stesso significato che in C++
1: Introduction
17
Operatori ed espressioni/2
!
!
Le convenzioni circa la precedenza tra gli operatori
sono le stesse che in C
La valutazione delle espressioni avviene in generale
da sinistra a destra, l’uso delle parentesi tonde è
analogo (es.: 7-3*2=1 ma (7-3)*2=8)
!
null: l’espressione null può essere assegnata a tutti i
tipi non primitivi
!
Come vedremo, l’accesso ai tipi non primitivi avviene
(implicitamente) per riferimento
!
null assegnato a una variabile di tipo non primitivo
(array, oggetti ecc.) significa che la variabile non
punta a nulla
1: Introduction
18
Dichiarazione di variabili e
assegnazioni
!
Dichiarazione di variabili
µ
µ
µ
!
int i, j;
myClass myObject; /* myObject è un oggetto di classe
myClass */
int i = 0; /* Dichiarazione e inizializzazione */
Assegnazioni
µ
j = (i = 5); /* j e i valgono 5 al termine dell’istruzione */
µ
Se Object1 e Object2 sono oggetti della stessa classe:
Object1 = Object2; /* Al termine Object1 punta allo stesso
oggetto di Object2 */
!
L’accesso per riferimento ai tipi non primitivi verrà
1: Introduction
discusso più avanti
19
Campo di azione degli
identificatori
!
!
!
Variabili di classe: sono
visibili in tutta la classe
a meno di **
Variabili locali: quelle
definite all interno di un
blocco di codice
(variabili locali ai metodi
ma non solo)
Parametri dei metodi:
visibili in tutto il corpo
del metodo
if (......) {
int i = 10; /* var. locale */
<Altre istruzioni>
} /* End if */
System.out.println(i); /* Errore!!
*/
Attenzione: le variabili locali
devono essere inizializzate
prima dell’uso
1: Introduction
20