Sei sulla pagina 1di 51

Introduzione a JAVA

Dott. Ing. Leonardo Rigutini


Dipartimento Ingegneria dell’Informazione
Università di Siena
Via Roma 56 – 53100 – SIENA
Uff. 0577233606
rigutini@dii.unisi.it
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:
¾ Elettrodomestici intelligenti, telefoni mobili, ecc….

¾ Il linguaggio era stato progettato per essere SEMPLICE e


NEUTRALE rispetto all’architetture, in modo da operare su
hardware diversi:
¾ 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
¾ 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
¾ Servlets e JSP
¾ 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
Java 11101001 HelloWorld.class
Compiler 10101011
11100101
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:
¾ La variabile nome è quindi diversa da Nome

¾ È consigliato inserire delle linee di commento per rendere il codice


più leggibile e comprensibile (commentare il codice):
¾ 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
¾ Ogni istruzione deve essere terminata da un ‘;’
¾ Blocchi di codice
¾ 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:
¾ Il debugging

¾ 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 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