Parte I “Le basi del linguaggio” Cosa è Java (what) Secondo alcune statistiche, attualmente Java è il linguaggio di programmazione con il più alto numero di sviluppatori nel mondo. Il successo crescente ed inarrestabile presso la comunità dei programmatori ha fatto sì che Sun Microsystems, società che ha sviluppato il linguaggio, negli anni investisse molto su esso. In poco tempo infatti, si sono evolute ed affermate tecnologie (JSP, EJB, Applet, Midlet etc.), basate sul linguaggio, che si sono diffuse in molti ambiti del mondo della programmazione. Oggigiorno esistono miliardi di congegni elettronici che utilizzano tecnologia Java:SCADA, telefoni cellulari, decoder, smart card, robot che passeggiano su Marte etc… Con il termine "Java", quindi, ci si riferisce sia al linguaggio sia alla tecnologia che include tutte le tecnologie di cui sopra. Java è un linguaggio orientato agli oggetti (object oriented), ovvero supporta i paradigmi dell’incapsulamento, dell’ereditarietà e del polimorfismo (verranno spiegati più avanti). Ciò ne rende l’apprendimento ostico per chi ha esperienze radicate di programmazione procedurale. Inoltre si tratta di un linguaggio in continua evoluzione e gli sviluppatori devono continuamente aggiornarsi per restare al passo. Dalla versione 1.0 alla versione 1.5 (detta anche versione 5), i cambiamenti sono stati veramente tanti e importanti. Breve storia di Java (who, where & when) Java ha visto la luce a partire da ricerche effettuate alla Stanford University all’inizio degli anni Novanta. Nel 1992 nasce il linguaggio Oak (in italiano “quercia”), prodotto da Sun Microsystems e realizzato da un gruppo di esperti sviluppatori, che formavano il cosiddetto "Green Team". Erano capitanati da James Gosling, oggigiorno uno tra i più famosi e stimati "guru" informatici del pianeta, nonché vicepresidente di Sun. Sembra che il nome Oak derivi dal fatto che Gosling e i suoi colleghi, nel periodo in cui svilupparono questo nuovo linguaggio, avessero avuto come unica compagnia quella di una quercia che si trovava proprio fuori la finestra dell’ufficio in cui lavoravano. In un primo momento Sun decise di destinare questo nuovo prodotto alla creazione di applicazioni complesse per piccoli dispositivi elettronici. In particolare, sembrava che i campi strategici da conquistare in quegli anni fossero la domotica (scienza interdisciplinare che si occupa dello studio e delle tecnologie atte a migliorare la qualità della vita nella casa) e la TV via cavo. In realtà i tempi non erano ancora maturi per argomenti quali il "video on demand" e gli "elettrodomestici intelligenti". Solo dopo qualche anno, infatti, si è iniziato a richiedere video tramite Internet o TV via cavo. E ancora oggi l’idea di avere un "robot" che svolga le faccende domestiche rimane solo un sogno per le casalinghe. Nel 1993, con l’esplosione di Internet (negli Stati Uniti), nacque l’idea di trasmettere codice eseguibile attraverso pagine HTML. La nascita delle applicazioni che utilizzano la tecnologia CGI (Common Gateway Interface) rivoluzionò il World Wide Web. Prof.ssa Colombara Rosamaria --- Java – http://www.profcolombara.it 1 Il mercato che sembrò più appetibile allora, divenne ben presto proprio Internet. Nel 1994 viene quindi prontamente realizzato un browser che fu chiamato per breve tempo "Web Runner" (dal film "Blade Runner", il preferito di Gosling) e poi, in via definitiva, "HotJava". Per la verità non si trattava di uno strumento molto performante, ma la sua nascita dimostrò al mondo che con Java si poteva iniziare a programmare per Internet. Il 23 maggio del 1995 Oak, dopo una importante rivisitazione, viene ribattezzato ufficialmente col nome "Java". Il nome questa volta sembra derivi da una tipologia indonesiana di caffè molto famosa negli Stati Uniti, che pare fosse la preferita di Gosling. Per quanto Gosling sia un grande genio, non si può dire che abbia molta fantasia nello scegliere nomi! Contemporaneamente Netscape Corporation annuncia la scelta di dotare il suo allora omonimo e celeberrimo browser della Java Virtual Machine (JVM). Si tratta del software che permette di eseguire programmi scritti in Java su qualsiasi piattaforma. Questo significava una nuova rivoluzione nel mondo Internet: grazie alla tecnologia Applet, le pagine Web diventavano interattive a livello client (ovvero le applicazioni vengono eseguite direttamente sulla macchina dell’utente di Internet, e non su un server remoto). Gli utenti potevano per esempio utilizzare giochi direttamente sulle pagine Web ed usufruire di chat dinamiche e interattive. In breve tempo, inoltre, Sun Microsystems mette a disposizione gratuitamente il kit di sviluppo JDK (Java Development Kit) scaricabile dal sito http://java.sun.com. Nel giro di pochi mesi i download del JDK 1.02a diventarono migliaia e Java iniziò ad essere sulla bocca di tutti. La maggior parte della pubblicità di cui usufruì Java nei primi tempi era direttamente dipendente dalla possibilità di scrivere piccole applicazioni in rete, sicure, interattive ed indipendenti dalla piattaforma, chiamate proprio "applet" (in italiano si potrebbe tradurre “applicazioncina”). Nei primi tempi, quindi, sembrava che Java fosse il linguaggio giusto per creare siti Web spettacolari. In realtà, Java era molto più che un semplice strumento per rendere piacevole alla vista la navigazione. Inoltre ben presto furono realizzati strumenti per ottenere certi risultati con minor sforzo (vedi Flash di Macromedia). Tuttavia, la pubblicità che a Java hanno fornito Netscape (nel 1995 un colosso che combatteva alla pari con Microsoft la “guerra dei browser”…) e successivamente altre grandi società quali IBM, Oracle etc. ha dato i suoi frutti. Negli anni Java è diventato sempre più la soluzione ideale a problemi (come la sicurezza) che accomunano aziende operanti in settori diversi come banche, software house e compagnie d’assicurazioni. Inoltre, nel nuovo millennio la tecnologia Java ha conquistato nuove nicchie di mercato come le smart card, i telefoni cellulari e il digitale terrestre. Queste conquiste sono sicuramente state un successo. Java ha infatti dato un grosso impulso alla diffusione di questi beni di consumo negli ultimi anni. Infine, grazie alla sua filosofia “write once, run everywhere” (“scritto una volta gira dappertutto”), la tecnologia Java è potenzialmente eseguibile anche su congegni che non hanno ancora visto la luce. Oggi Java è quindi un potente e affermatissimo linguaggio di programmazione. Conta il più alto numero di sviluppatori attivi nel mondo. La tecnologia Java ha invaso la nostra vita quotidiana essendo presente, per esempio, nei nostri telefoni cellulari. Probabilmente si tratta del primo linguaggio di programmazione il cui nome è entrato nel vocabolario di chi di programmazione non ne sa nulla. Infatti, spesso si sente parlare di Java Chat, giochi Java, Java card, etc… Perché Java (why) Nei mesi che precedettero la nascita di Oak, nel mondo informatico circolavano statistiche alquanto inquietanti. Una di esse calcolava che, in una prima release di un’applicazione scritta in C++, fosse presente in media un bug ogni cinquanta righe di codice! Considerando anche che il C++ era Prof.ssa Colombara Rosamaria --- Java – http://www.profcolombara.it 2 all’epoca il linguaggio più utilizzato nella programmazione, la statistica risultava ancora più allarmante. A partire da queste ed altre statistiche, Java è stato creato proprio per superare i limiti esistenti negli altri linguaggi. In generale si andò nella direzione di un linguaggio potente, moderno, chiaro, ma soprattutto robusto e "funzionante". Caratteristiche di Java Java ha alcune importanti caratteristiche che permetteranno a chiunque di apprezzarne i vantaggi. Sintassi: è simile a quella del C e del C++, e questo non può far altro che facilitare la migrazione dei programmatori da due tra i più importanti ed utilizzati linguaggi esistenti. Chi non ha familiarità con questo tipo di sintassi può inizialmente sentirsi disorientato e confuso, ma ne apprezzerà presto l’eleganza e la praticità. Gratuito: per scrivere applicazioni commerciali non bisogna pagare licenze a nessuno. Infatti il codice Java si può scrivere anche utilizzando editor di testo come il Blocco Note, e non per forza un complicato IDE con una costosa licenza. Ovviamente esistono anche tanti strumenti di sviluppo a pagamento, che possono accelerare lo sviluppo delle applicazioni Java. Ma esistono anche eccellenti prodotti gratuiti ed open source come Eclipse (http://www.eclipse.org) e Bluej, che non hanno nulla da invidiare a nessun altro tool. Robustezza: questa è soprattutto una conseguenza di una gestione delle eccezioni chiara e funzionale, e di un meccanismo automatico della gestione della memoria (Garbage Collection. Inoltre il compilatore Java è molto "severo". Il programmatore è infatti costretto a risolvere tutte le situazioni "poco chiare", garantendo al programma maggiori chance di corretto funzionamento. È molto meglio ottenere un errore in compilazione che in esecuzione… Libreria e standardizzazione: Java possiede un’enorme libreria di classi standard, ottimamente documentate. Ciò rende Java un linguaggio di alto livello e permette anche ai neofiti di creare applicazioni complesse in breve tempo. Per esempio, è piuttosto semplice gestire finestre di sistema (interfacce grafiche utente), collegamenti a database e connessioni di rete. E questo indipendentemente dalla piattaforma su cui si sviluppa. Indipendenza dall’architettura: grazie al concetto di macchina virtuale ogni applicazione, una volta compilata, potrà essere eseguita su una qualsiasi piattaforma (per esempio un PC con sistema operativo Windows o una workstation Unix). Questa è sicuramente la caratteristica più importante di Java. Infatti, nel caso in cui si debba implementare un programma destinato a diverse piattaforme, non ci sarà la necessità di doverlo convertire radicalmente da questa a quella. E’ evidente quindi che la diffusione di Internet ha favorito e favorirà sempre di più la diffusione di Java. Java Virtual Machine: ciò che rende di fatto possibile l’indipendenza dalla piattaforma è la Java Virtual Machine (da ora in poi JVM), un software che svolge un ruolo da interprete ( esegue il programma compilato) per le applicazioni Java. Più precisamente: dopo aver scritto il nostro programma Java, bisogna compilarlo. Otterremo così non un file eseguibile (ovvero la traduzione in linguaggio macchina del file sorgente che abbiamo scritto in Java), ma un file che contiene la traduzione del nostro listato in un linguaggio molto vicino al linguaggio macchina, detto bytecode". Una volta ottenuto questo file dobbiamo interpretarlo. A questo punto la JVM interpreterà il bytecode ed il nostro programma andrà finalmente in esecuzione. Quindi, se una piattaforma qualsiasi possiede una Java Virtual Machine, ciò sarà sufficiente per renderla potenziale esecutrice di bytecode. Infatti, da quando ha visto la luce Java, i browser più diffusi implementano al loro interno una versione della JVM, capace di mandare in esecuzione le applet Java. Ecco quindi svelato il segreto dell’indipendenza della piattaforma: se una macchina possiede una JVM, può eseguire codice Java. Prof.ssa Colombara Rosamaria --- Java – http://www.profcolombara.it 3 Un browser mette a disposizione una JVM solamente per le applet, non per le applicazioni standard. Spesso però le applicazioni scritte in Java vengono distribuite con una installazione di JVM incorporata. Si parla di "macchina virtuale" perché in pratica questo software è stato implementato per simulare un hardware. Si potrebbe affermare che “il linguaggio macchina sta ad un computer come il bytecode sta ad una Java Virtual Machine”. Oltre che permettere l’indipendenza dalla piattaforma, la JVM permette a Java di essere un linguaggio multithreaded (caratteristica di solito tipica dei sistemi operativi), ovvero capace di mandare in esecuzione più processi in maniera parallela. Orientato agli oggetti: Java fornisce strumenti che praticamente ci "obbligano" a programmare ad oggetti. Java è più chiaro e schematico di qualsiasi altro linguaggio orientato agli oggetti. Sicuramente chi impara Java potrà in un secondo momento accedere in modo più naturale alla conoscenza di altri linguaggi orientati agli oggetti. Programmazione strutturata Problema complesso Scomposizione in procedure Programmazione ad oggetti Sistema complesso Scomposizione in entità interagenti (oggetti) Prof.ssa Colombara Rosamaria --- Java – http://www.profcolombara.it 4 Per capire cosa si intende con oggetto, si può partire prendendo spunto dalle cose della vita comune : per esempio un’automobile è un oggetto, un televisore è un oggetto e così via. Semplice: qui bisogna fare una precisazione. Java è un linguaggio molto complesso, considerandone la potenza e tenendo presente che ci obbliga ad imparare la programmazione ad oggetti. In compenso si possono ottenere risultati insperati in un tempo relativamente breve. Provocatoriamente Bill Joy, vicepresidente di Sun Microsystems negli anni in cui nacque il linguaggio, nonché creatore di software storici come il sistema operativo Solaris , propose come nome alternativo a Java "C++--". Questo per sottolineare con ironia che il nuovo linguaggio voleva essere un nuovo C++, ma senza le sue caratteristiche peggiori (o, se vogliamo, senza le caratteristiche più difficili da utilizzare e quindi più pericolose). Sun ha inoltre pubblicizzato Java dalla versione 5 in poi, sostituendo il termine “Simplicity” con “ease of development” (in italiano “facilità di sviluppo”). Infatti, con l’introduzione nella versione 5 il linguaggio è diventato più difficile da imparare, ma i programmi dovrebbero però essere più semplici da scrivere. Insomma, imparare Java, non sarà una passeggiata!!! Sicurezza: ovviamente, avendo la possibilità di scrivere applicazioni interattive in rete, Java possiede anche caratteristiche di sicurezza molto efficienti. Come c’insegna però la vita quotidiana, nulla è certo al 100%. Intanto, oggi come oggi, Java è semplicemente il linguaggio “più sicuro” in circolazione Ambiente di sviluppo Per scrivere un programma Java, abbiamo bisogno di: 1. Un programma che permetta di scrivere il codice. Per iniziare può andar bene un semplice Text Editor, come ad esempio Notepad (Blocco Note) di Windows, Edit del Dos o Vi di Unix (sconsigliamo WordPad…). È anche possibile eseguire il download gratuito dell’editor Java open source Bluej, all’indirizzo http://www.bluej.com/. Si tratta di un editor Java di semplice utilizzo, che offre alcune comodità rispetto ad un editor di testo generico. Tra le sue caratteristiche ricordiamo la colorazione della sintassi di Java, e il completamento del testo di alcune espressioni. Soprattutto è possibile compilare e mandare in esecuzione file, tramite la pressione di semplici pulsanti. 2. Il Java Development Kit versione Standard Edition (da ora in poi JDK). E' scaricabile gratuitamente sul sito di riferimento dello sviluppatore Java: http://java.sun.com, con le relative note d’installazione e documentazione. Il JDK offre tutto l'occorrente per lavorare in modo completo. Passi dello sviluppatore Dopo aver installato correttamente il JDK, saremo pronti per scrivere la nostra prima applicazione In generale dovremo eseguire i seguenti passi: 1. Scrittura del codice: scriveremo il codice sorgente della nostra applicazione utilizzando un editor. Come già detto precedentemente useremo Bluej. 2. Salvataggio: salveremo il nostro file con suffisso .java (automatico con Bluej). 3. Compilazione: Se la compilazione ha esito positivo, verrà creato un file chiamato “nomeFile.class”. In questo file, come abbiamo già detto, ci sarà la traduzione in bytecode del file sorgente. 4. Esecuzione: a questo punto potremo mandare in esecuzione il programma invocando l’interpretazione della Java Virtual Machine. L’applicazione, a meno di errori di codice, verrà eseguita dalla JVM. Prof.ssa Colombara Rosamaria --- Java – http://www.profcolombara.it 5 Classi, oggetti, attributi e metodi. E’ da sottolineare subito che tutto il codice scritto in applicazioni Java, a parte poche eccezioni, è sempre incluso all’interno della definizione di qualche classe La classe rappresenta un modello per descrivere un insieme di oggetti. Una classe specifica gli attributi e i metodi che devono avere gli oggetti che appartengono alla classe. Un oggetto non può esistere se prima non viene creata una classe a cui l’oggetto deve appartenere. La classe può essere immaginata come uno stampo del quale vengono creati più oggetti, tutti con gli stessi attributi e metodo. Gli oggetti creati a partire da una classe vengono chiamati istanze della classe: OGGETTO = istanza della CLASSE Nello sviluppo di un programma orientato ad oggetti, prima vengono definite le classe, poi possono essere creati più oggetti come istanze di quelle classi. Se per esempio indichiamo con Automobile la classe che modella un’automobile, da questa possiamo creare due oggetti chiamati auto1 e auto2, come istanze della classe Automobile. Due istanze della stessa classe sono distinguibili solo per il valore dei loro attributi, mentre il comportamento (metodi) è lo stesso. Gli oggetti auto1 e auto2 possono avere quindi un valore della velocità o del livello del carburante (attributi), ma possono usare gli stessi metodi (comportamenti) visto che appartengono alla stessa classe. Si può per esempio inviare il messaggio fermati o accelera ad entrambi gli oggetti. Definire una classe significa elencare gli attributi e i metodi. Durante la fase di creazione della classe si specificano gli attributi e si codificano i metodi. <nome classe> <attributo1> <attributo2> …… <metodo1> <metodo2> …. Con riferimento all’esempio dell’automobile, la classe Automobile è rappresentata con il seguente diagramma della classe: <Automobile> <velocità> <Colore> <numero di porte> <livello del carburante> <avviati> <accelera> <fermati> <gira> <cambia marcia> Prof.ssa Colombara Rosamaria --- Java – http://www.profcolombara.it 6 Usando questa classe possiamo creare gli oggetti auto1 e auto2. Dopo aver creato gli oggetti, possiamo interagire con essi, per esempio possiamo impostare alcuni attributi: auto1.colore = blu oppure possiamo usare i metodi dell’oggetto auto2.avviati() Primo approccio al codice Diamo subito uno sguardo alla classica applicazione "Hello World". Trattasi del tipico primo programma che rappresenta il punto di partenza dell'apprendimento di ogni linguaggio di programmazione. In questo modo inizieremo a familiarizzare con la sintassi e con qualche concetto fondamentale come quello di classe e di metodo. Vi avverto che qualche punto rimarrà oscuro, e che bisognerà dare per scontate alcuni parti di codice. Vedremo anche come compilare e come mandare in esecuzione il nostro “miniprogramma”. Il fine è stampare a video il messaggio "Hello World!" Segue il listato: 1 public class HelloWorld 2 { 3 public static void main(String args[]) 4 { 5 System.out.println("Hello World!"); 6 } 7 } Questo programma deve essere salvato esattamente col nome della classe, prestando attenzione anche alle lettere maiuscole o minuscole. Tale condizione è necessaria per mandare in esecuzione l’applicazione. Il file che conterrà il listato appena presentato dovrà quindi chiamarsi “HelloWorld.java”. Attenzione: i numeri non fanno parte del codice ma ci saranno utili per la sua analisi (non bisogna scriverli). Prof.ssa Colombara Rosamaria --- Java – http://www.profcolombara.it 7 Analisi del programma "HelloWorld" Riga 1: public class HelloWorld Dichiarazione della classe HelloWorld. Come vedremo, ogni applicazione Java è costituita da classi. E’ da sottolineare subito che tutto il codice scritto in applicazioni Java, a parte poche eccezioni (le importazioni di librerie e le dichiarazioni d’appartenenza ad un package), è sempre incluso all’interno della definizione di qualche classe . Abituiamoci anche ad anteporre la parola chiave public alla dichiarazione delle nostre classi; più avanti capiremo il perché. Riga 2: { Questa parentesi graffa aperta indica l’inizio della classe HelloWorld, che si chiuderà alla riga 7 con una corrispondenteparentesi graffa chiusa. Il blocco di codice compreso da queste due parentesi definisce la classe HelloWorld. Sulle tastiere italiane non esiste un tasto per stampare le parentesi graffe. Possiamo però ottenerne la scrittura in diversi modi, di seguito i più utilizzati: - tenendo premuto il tasto ALT e scrivendo 123 con i tasti numerici che si trovano sulla destra della vostra tastiera, per poi rilasciare l’ALT; - tenendo premuti i tasti CONTROL - SHIFT - ALT, e poi il tasto con il simbolo della parentesi quadra aperta "[". Riga 3: public static void main(String args[]) Questa riga è bene memorizzarla da subito, poiché deve essere definita in ogni applicazione Java. Trattasi della dichiarazione del metodo main(). In Java, il termine “metodo” è sinonimo di “azione” o comportamento. In particolare il metodo main() definisce il punto di partenza dell’esecuzione di ogni programma. La prima istruzione che verrà quindi eseguita in fase di esecuzione, sarà quella che la JVM troverà subito dopo l’apertura del blocco di codice che definisce questo metodo. Oltre alla parola "main", la riga 3 contiene altre parole di cui studieremo in dettaglio il significato più avanti. Purtroppo, come già anticipato, quando si inizia a studiare un linguaggio ad oggetti come Java, è impossibile toccare un argomento senza toccarne tanti altri. Riga 4: { Questa parentesi graffa indica l’inizio del metodo main(), che si chiuderà alla riga 6 con una parentesi graffa chiusa. Il blocco di codice compreso tra queste due parentesi definisce il metodo. Prof.ssa Colombara Rosamaria --- Java – http://www.profcolombara.it 8 Riga 5: System.out.println("Hello World!"); Questo comando stamperà a video la stringa "Hello World!". Anche in questo caso, giacché dovremmo introdurre argomenti per i quali non siete ancora pronti, preferisco rimandare la spiegazione dettagliata di questo comando nelle prossime lezioni. Per ora ci basterà sapere che stiamo invocando un metodo appartenente alla libreria standard di Java che si chiama println(), passandogli come parametro la stringa che dovrà essere stampata. Riga 6: } Questa parentesi graffa chiusa bilancia l’ultima che è stata aperta, ovvero chiude il blocco di codice che definisce il metodo main(). Sulle tastiere italiane non esiste un tasto per stampare le parentesi graffe. Possiamo però ottenerne la scrittura in diversi modi, di seguito i più utilizzati: - tenendo premuto il tasto ALT e scrivendo 125 con i tasti numerici che si trovano sulla destra della vostra tastiera, per poi rilasciare l’ALT; - tenendo premuti i tasti Control - Shift - Alt, e poi il tasto con il simbolo della parentesi quadra chiusa "]". Riga 7: } Questa parentesi graffa invece chiude il blocco di codice che definisce la classe HelloWorld. Compilazione ed esecuzione del programma HelloWorld Una volta riscritto il listato sfruttando un text editor dobbiamo compilarlo. Se al termine della compilazione non ci viene fornito nessun messaggio d’errore, vuol dire che la compilazione ha avuto successo. A questo punto possiamo notare che nella nostra cartella di lavoro è stato creato un file di nome HelloWorld.class. Questo è appunto il file sorgente tradotto in bytecode, pronto per essere interpretato dalla JVM. Se quindi lanciamo il comando di esecuzione del nostro programma verrà stampato il tanto sospirato messaggio. Riepilogo In questo modulo abbiamo definito Java come linguaggio e come tecnologia, ed abbiamo descritto il linguaggio mediante le sue caratteristiche. Abbiamo inoltre descritto l’ambiente di sviluppo ed abbiamo imparato a compilare e mandare in esecuzione una semplice applicazione Java. INfie abbiamo approcciato un piccolo programma, per avere un’idea di alcuni concetti fondamentali. Prof.ssa Colombara Rosamaria --- Java – http://www.profcolombara.it 9