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