Introduzione a JAVA
Dott. Ing. Leonardo Rigutini
Dipartimento Ingegneria dell’Informazione
Università di Siena
Via Roma 56 – 53100 – SIENA
Uff. 0577233606
[email protected]
http://www.dii.unisi.it/~rigutini/
JAVA
Il linguaggio di programmazione JAVA
¾
Nel 1991 un gruppo di Sun MicroSystems, guidato da James
Gosling e Patrick Naughton, progettò un linguaggio chiamato in
codice “Green”, per l’utilizzo in apparecchi di consumo:
¾
¾
Il linguaggio era stato progettato per essere SEMPLICE e
NEUTRALE rispetto all’architetture, in modo da operare su
hardware diversi:
¾
¾
Elettrodomestici intelligenti, telefoni mobili, ecc….
Non si trovò mai un cliente per questa tecnologia
Nel 1994, la squadra si rese conto che un’altra area poteva sfruttare
le proprietà di “Green”: il filone client/server
¾
¾
¾
Indipendenza dall’architettura
Esecuzione in tempo reale
Affidabilità e sicurezza
Nasce JAVA
¾
Nel 1995 fu presentato dalla Sun il browser HotJava che aveva una
caratteristica unica:
¾
Poteva scaricare piccoli programmi, chiamati applet , dal web ed
eseguirli sulla macchina client con un elevato grado di sicurezza
¾
Gli applet scritti nel linguaggio che adesso si chiama Java,
permettevano agli sviluppatori Web di predisporre una serie di
animazioni e integrazioni che potevano migliorare molto le
potenzialità della pagina
¾
Dal 1996, sia Netscape (allora molto diffuso) che Explorer
supportano Java
La crescita di Java
¾
Da allora Java è cresciuto a ritmo fenomenale:
¾
I programmatori lo hanno adottato per la sua elevata semplicità rispetto
al rivale/progenitore (il C++)
¾
Inoltre la Sun rilasciava con Java, una libreria enormemente ricca
(JDK – Java Development Kit) che forniva agli sviluppatori una
innumerevole quantità di classi per i problemi più diversi
¾
Nel 1998 la Sun rilasciò la nuova versione del linguaggio, chiamata
Java2, e la sua libreria ampliata con nuove classi:
¾
La nuova release aveva due versioni, la micro-edition(J2ME), pensata
per lo sviluppo su piccoli dispositivi integrati (gli anni del boom del
cellulare) e la enterprise edition (J2EE), pensata per le workstation
JAVA ed internet
¾
Poiché Java era stato pensato per Internet, ha due qualità che lo
rendono molto adatto per i principianti:
¾
¾
¾
Sicurezza – le applet si avviano automaticamente una volta scaricate dal
browser, quindi è importante che esse siano intrinsecamente sicuri
Trasferibilità – lo stesso programma Java è eseguibile su qualsiasi
piattaforma (Windows, Unix-like o Machintosh)
Quando si visita un sito, il server web non ha idea di quale computer
state utilizzando, ma restituisce semplicemente il codice trasferibile
che è stato generato dal compilatore Java
¾
la macchina virtuale Java sul computer client si occuperà di eseguire
questo codice trasferibile
Tipi di programmi Java
¾
Applets
¾
¾
¾
¾
Servlets e JSP
¾
¾
¾
Piccoli programmi Java utilizzati all'interno di pagine HTML
Vengono scaricate insieme alla pagina HTML ed eseguite lato client (dal
browser o da un applet viewer)
Normalmente i browser incorporano una JVM con cui eseguono l'applet
Sono programmi Java che risiedono sul server Web e vengono invocati
dalle pagine HTML
Vengono eseguiti lato server solitamente per la generazione di pagine
Web dinamiche (accesso a Database, risposta a dati inviati o operazioni
effettuate dall’utente)
Applicazioni
¾
Sono normali programmi eseguiti su una JVM (lanciata esplicitamente
da riga di comando)
Scrivere un programma in Java
¾
Una caratteristica che ha reso popolare il Java è quella di essere
indipendente dal S.O. in cui un programma è compilato. Ma come è
resa possibile questa cosa?
¾
Il compilatore Java produce un codice che non è il codice binario
finale, ma un codice binario intermedio chiamato bytecode
(indipendente dall’architettura)
¾
Questo codice intermedio è interpretato da una “macchina virtuale”
che lo traduce in istruzioni macchina
¾
¾
la Java Virtual Machine (JVM)
La JVM ha bisogno di conoscere il SO su cui sta girando. La Sun
mette a disposizione JVM per tutti i sistemi operativi:
¾
Windows, Linux, Unix, Mac ecc…
Scrivere un programma in Java
¾
In definitiva, scrivere un programma Java vuole dire creare un file di
testo contenente del codice Java:
¾
un file per ogni classe (ossia astrazione dell’oggetto)
¾
Il file così creato ha estensione .java e deve essere passato al
compilatore Java:
javac xxx.java Î xxx.class
¾
Questo software crea un file .class con lo stesso nome
dell’originario, che contiene il bytecode per la JVM
java xxx Î esecuzione del main della classe xxx.class
Es
HelloWorld.java
class HelloWorld {
public static void main(String[] args) {
System.out.println(“Hello World!”);
}
}
bytecode
01010101
11010101
11101001 HelloWorld.class
10101011
11100101
Java
Compiler
javac
¾
javac e java sono forniti con la
distribuzione Java (JDK)
java
JVM
javac.exe e java.exe
¾
Forniti con la distribuzione Java della SUN:
¾
¾
JDK
Dipendono dall’architettura su cui si va ad operare:
¾
È necessario utilizzare il JDK per Windows se si usa Windows,
ugualmente per Linux, Mac ecc…
¾
Sono applicazioni lanciate dall’utente dalla shell dei comandi oppure
dall’ambiente di sviluppo grafico utilizzato
¾
Devono essere nel path di ricerca del S.O. :
Es. in windows:
path %path%;C:\Programmi\Java\jdk1.5.0_02;C:\Programmi\Java\
jdk1.5.0_02\bin;
set JAVAHOME=C:\Programmi\Java\jdk1.5.0_02
javac.exe
java.exe
CLASSPATH
¾
Quando creiamo una classe Java (nell’esempio precedente ‘prova’),
affinché sia utilizzabile è necessario che il nome del file sia lo stesso
del nome della classe:
¾
¾
¾
La classe prova va quindi salvata in un file prova.java e compilata nel
file prova.class
Il compilatore javac si occupa di generare il file .class con il nome del
file .java che gli viene fornito come parametro di ingresso
Il file .class deve poi essere nel classpath della macchina virtuale,
altrimenti non sarà trovato. E’ possibile specificare il classpath come
opzione diretta alla JVM:
java.exe –classpath [PATH1;PATH2;…;PATHn] file.class
¾
In alternativa si può definire una variabile di sistema CLASSPATH
da cui il compilatore e la JVM leggono automaticamente il
classpath
Classpath in javac
Classpath in JVM
Regole di base di JAVA
Regole di base – 1
¾
Java, come quasi tutti i linguaggi di programmazione di alto livello è
case-sensitive, distingue cioè le lettere minuscole da quelle
maiuscole:
¾
¾
È consigliato inserire delle linee di commento per rendere il codice
più leggibile e comprensibile (commentare il codice):
¾
¾
¾
La variabile nome è quindi diversa da Nome
La sequenza // permette di commentare la parte di riga rimanente
I delimitatori /* e */ permettono di commentare tutto ciò compreso tra
queste due sequenze di caratteri
Es:
int a=3; // questa parte finale della riga è commentata
/* commento su
più
righe */
Regole di base – 2
¾
Istruzione
¾
¾
Blocchi di codice
¾
¾
Ogni istruzione deve essere terminata da un ‘;’
Ogni blocco di codice (sequenza di una o più istruzioni da eseguire in
blocco) è racchiuso tra parentesi graffe: ‘{ }’
Formattazione
¾
¾
Una singola istruzione per riga
L’apertura di un blocco viene indentata per rendere più chiara la struttura
del blocco
class HelloWorld {
public static main(String[] args) {
// visualizza un messaggio di saluto
System.out.println(“Hello World !!”);
}
}
Facciamo un esempio
¾
Scrivere un applicazione di benvenuto:
¾
¾
¾
il cosiddetto HelloWorld
Iniziamo col creare un file HelloWorld.java con il notepad (o
qualsiasi altro editor di testo)
Scriviamo il codice per la nostra applicazione:
class HelloWorld {
public static void main(String[] args) {
System.out.println(“Hello World!”);
}
}
¾
Utilizziamo lo script JavaEnvStart disponibile in rete su Sunto
(\\sunto\Laboratorio Java\esempi):
¾
Questo script setta le variabili di ambiente JAVAHOME e PATH
in modo cha sia possibile utilizzare javac.exe e java.exe
Facciamo un esempio
¾
Copiamo lo script nella directory dove abbiamo salvato il file
HelloWorld.java ed avviamo la shell
¾
Digitiamo:
javac HelloWorld.java
E vediamo che viene creato il file HelloWorld.class
¾
Se proviamo ad aprire il file HelloWorld.class con un editor di testo
(notepad), vediamo una sequenza di caratteri incomprensibile:
¾
¾
bytecode della nostra prima applicazione Java
Adesso chiamiamo la JVM per eseguire la nostra classe:
java HelloWorld
Facciamo un esempio
¾
Otteniamo però un errore:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
Cosa vuol dire? La JVM non trova la classe HelloWorld di cui deve lanciare
la funzione main()
¾
Forse vuole il nome del file:
java HelloWorld.class
¾
Otteniamo ancora un errore simile:
Exception in thread "main" java.lang.NoClassDefFoundError:
HelloWorld/class
La JVM ancora non trova la classe HelloWorld/class (spiegheremo in
seguito la differenza tra questi due errori)
¾
Dove è il problema?
Facciamo un esempio
¾
Il problema sta nel fatto che la JVM cerca la classe HelloWorld
(ossia il file HelloWorld.class) nei percorsi specificati dalla variabile
di sistema CLASSPATH:
¾
¾
Questa variabile non contiene però il percorso dove realmente si trova
HelloWorld.class
E’ necessario quindi specificare alla JVM che cerchi il file (o meglio
la classe) anche nella directory corrente:
java –cp . HelloWorld
¾
Adesso funziona tutto !!
Facciamo un esempio
¾
Proviamo adesso a rinominare la funzione main(String[] args) con
run(String[] args) e compiliamo di nuovo:
¾
¾
Per adesso nessun problema, javac genera il file HelloWorld.class
Proviamo a lanciare HelloWorld.class :
java –cp . HelloWorld
¾
Ovviamente otteniamo un errore:
¾
¾
Exception in thread "main" java.lang.NoSuchMethodError: main
Perché OVVIAMENTE ? Che errore si verifica ?
Facciamo un esempio
¾
Leggendo attentamente il messaggio di errore si vede che la JVM ci
sta dicendo che non trova il metodo main
¾
¾
Il metodo main di un oggetto, come detto, contiene il corpo principale
dell’applicazione rappresentata dall’oggetto stesso
Quando si invia un oggetto alla JVM, quest’ultima prova a lanciare il
metodo main, ad eseguire quindi l’oggetto come se fosse un
applicazione:
¾
Se tale metodo non esiste, la JVM ritorna un errore del tipo visto prima
Esempio
¾
Esempio:
01.HelloWorld\01.HelloWorld
IDE e JBuilder
Integrated Development Environment (IDE)
¾
Un IDE è una applicazione grafica che fornisce al programmatore un
ambiente di sviluppo completo ma al tempo stesso semplice e
chiaro
¾
Tramite una interfaccia grafica (GUI) è possibile costruire il progetto,
tenere sotto controllo le varie parti, effettuare il debugging e molto
altro ancora
¾
I più comuni ambienti di sviluppo Java sono:
¾
¾
¾
JBuilder – della Borland, a pagamento, ma è disponibile una versione
free (chiamata Foundation)
NetBeans – della SunMicrosystem, free scaricabile dal sito www.java.
Eclipse – della Eclipse Foundation
Integrated Development Environment (IDE)
¾
L’uso dei programmi da linea di comando javac e java viene
nascosto dalla IDE:
¾
¾
¾
Compilando il progetto, il software passa al compilatore tutti i files
necessari e genera i file .class
Anche l’esecuzione del programma è gestita dall’interfaccia e richiede
solamente di specificare quale funzione main() mandare in esecuzione
Anche la gestione del path e del classpath è automatizzata e resa
“friendly” dall’interfaccia grafica:
¾
¾
¾
Il path corrente è automaticamente inserito nel classpath
Aggiungendo librerie automaticamente viene aggiunto il percorso al
classpath
Ecc…
JBuilder
¾
L’ambiente che utilizzeremo in questo laboratorio è il JBuilder, ma
tutto ciò che viene fatto è facilmente trasportabile su NetBeans o su
Eclipse
¾
Oltre alla libreria standard del Java, ogni IDE può mettere a
disposizione librerie proprietarie da utilizzare nel progetto:
¾
¾
Non sempre consigliato dato che una caratteristica molto importante del
Java è quella della trasferibilità del codice e molte volte l’uso di librerie
proprietarie può limitare questa possibilità
Il JBuilder mette a disposizione una gran quantità di tipologie di
progetto:
¾
tramite un wizard è possibile scegliere il tipo di progetto, specificarne i
parametri ed iniziare a programmare
Esempio
¾
Proviamo adesso a creare una applicazione HelloWorld
utilizzando il JBuilder
¾
Prima di tutto avviamo il JBuilder
¾
Andiamo su File e selezioniamo new
¾
¾
¾
Possiamo creare direttamente una classe o un progetto. Nel primo
caso, viene richiesto comunque di creare un progetto per la classe.
Una volta scelto il nome del progetto e dove salvarlo passiamo alla
creazione guidata della classe
Ci viene chiesto il nome della classe (HelloWorld) ed il package:
¾
¾
Per adesso ignoriamo il package (lasciamo bianco il campo del
package)
Notiamo l’opzione “generate main method” che permette di
generare uno “scheletro” per la funzione main all’interno della classe
Esempio
¾
Inseriamo il codice Java nel file HelloWorld.java
class HelloWorld {
public static void main(String[] args) {
System.out.println(“Hello World!”);
}
}
¾
Adesso possiamo compilare ed eseguire l’applicazione:
¾
¾
Tramite il menù run lanciamo l’applicazione
Notiamo la possibilità di lanciare l’applicazione anche sotto debug
Esempio
¾
Nella finestra in basso vedremo visualizzato l’output
dell’applicazione
¾
E’ possibile verificare che anche in questo caso, rinominando la
funzione main() in qualsiasi altro modo (anche Main()) il JBuilder
ritorna errore
Esempio
¾
Esempio:
01.HelloWorld\02.HelloWorld-JBuilder
Debug
Debug in JBuilder
¾
Un IDE permette di effettuare un’operazione molto utile al
programmatore:
¾
¾
Trovare i punti in cui il programma si comporta in maniera differente
da quello che il creatore si aspettava è un lavoro molto difficile e
costoso:
¾
¾
Il debugging
Il debug a run-time permette di fissare dei break-point
Break-point: punto del programma in cui si desidera fermare il
flusso delle istruzioni per verificare ed ispezionare lo stato
dell’applicazione
Breakpoint
¾
Viene selezionata la riga di codice in cui si desidera interrompere il
programma
¾
Quando l’esecuzione del programma raggiunge tale riga di codice,
l’IDE interrompe l’esecuzione e permette all’utente di interagire con
il programma:
¾
per esempio la lettura di alcuni valori attuali dell’applicazione
¾
Una volta terminata la verifica è possibile “continuare” fino al
break-point successivo o fino alla terminazione dell’applicazione
¾
Inoltre esiste la modalità passo-passo in cui l’ambiente si ferma ad
ogni istruzione
Esempio
¾
Riprendiamo l’applicazione HelloWorld
¾
¾
¾
¾
Inseriamo una istruzione per aumentare il numero di istruzioni:
ES : una istruzione di assegnamento ad una variabile
int a = 4;
Mettiamo un break-point nella istruzione successiva a questa
Lanciamo l’applicazione in modalità debug
Esempio
¾
Vediamo che l’esecuzione si
interrompe alla linea di codice
con il break-point
¾
A questo punto è possibile:
¾
ispezionare i contenuti dell’oggetto
Esempio
¾
mettere dei watch sulle variabili
Esempio
¾
Infine è possibile “continuare” l’applicazione (F9) fino ad un successivo
break-point o alla fine, andare avanti passo-passo (F8), entrare
all’interno della funzione corrente(F7), ecc…
Modo 1
Modo 2
Esempio
¾
Esempio:
01.HelloWorld\02.HelloWorld-JBuilder
Il JavaDoc
Il JavaDoc
¾
L’ambiente di sviluppo grafico permette di creare la documentazione
in automatico:
¾
la Sun aveva previsto la possibilità di descrivere, mediante apposita
sintassi, le varie funzioni disponibili in ogni oggetto
¾
Per creare una descrizione di una funzione è sufficiente inserire
prima del metodo e fuori da ogni altra funzione la descrizione della
funzione delimitata dalle sequenze /** e */
¾
Aggiungendo il tool JavaDoc al progetto, è possibile creare la
documentazione della classi e delle funzioni del progetto:
JavaDoc
¾
Descrizione di una classe:
¾
¾
Quando inseriamo la sequenza /** il JBuilder automaticamente inserisce
i campi descrittivi della classe in cui l’autore può inserire la descrizione:
¾
titolo, descrizione, autore, versione, ecc…
Descrizione di una funzione
¾
¾
Quando inseriamo la sequenza /** il JBuilder crea automaticamente le
righe per la descrizione dei parametri di ingresso e di ritorno della
funzione:
¾
Es:
@param args String[] Î indica che la funzione ha un parametro di
ingresso args di tipo String[]
L’autore della funzione può inserire la descrizione della funzione nella
prima riga del blocco generato automaticamente da JBuilder
JavaDoc – Esempio
¾
Creare una classe HelloWorld deselezionando tutti i check-box
durante il wizard di JBuilder:
¾
¾
Verrà creata una classe semplice prova senza alcuna funzione o
variabile
class HelloWorld {
}
Creaiamo
il JavaDoc
per la classe:
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
class HelloWorld {
}
JavaDoc – Esempio
¾
¾
Creare una funzione nella classe HelloWorld (creiamo la funzione
main() che per ora è l’unica cha abbiamo visto come si scrive):
class HelloWorld {
public static void main(String[] args) {
}
Creiamo
il JavaDoc per questa funzione:
}
class HelloWorld {
/**
*
* @param args String[]
*/
public static void main(String[] args) {
}
}
JavaDoc – Esempio
¾
Inseriamo il titolo e la descrizione della classe e la descrizione della
funzione
/**
* <p>Title: Hello World</p>
* <p>Description: Classe di prova per il JavaDoc</p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
class HelloWorld {
/**
* Funzione principale per il test
* @param args String[]
*/
public static void main(String[] args) {
}
}
JavaDoc – Esempio
¾
Compiliamo, solo il JavaDoc o tutto quanto ed apriamo il file
index.html del JavaDoc:
JavaDoc – Esempio
¾
La funzione è visualizzata in due punti:
¾
nel sommario delle funzioni in cui viene mostrata una lista di tutte le
funzioni con un breve descrizione (la prima riga del commento inserito)
¾
nella sezione dettagli, in cui viene visualizzata tutta la descrizione
Esempio
¾
Esempio:
01.HelloWorld\02.HelloWorld-JBuilder