UNIVERSITA’ DI FIRENZE Facoltà di Ingegneria Ingegneria del Software Introduzione a Java Premessa e obiettivi di questa parte • • • • La tecnologia Java e’ stata sviluppata da un team della Sun Microsystem a partire dal 1991. Il rilascio ufficiale e l’integrazione in internet di Java e’ avvenuto nel 1995. Java è molto di più di un linguaggio di programmazione E’ un ambiente, non solo nel senso di un insieme di tools per scrivere e debuggare i programmi, ma nel senso più ampio di un insieme di librerie standardizzate che coprono ogni aspetto del linguaggio, del suo impiego, etc.. Quest’insieme di librerie è estremamente ampio e per usare bene Java occorre avere una certa dimestichezza con le sue librerie • Scopo di queste lezioni è far superare i problemi che si presentano al neofita • Il Software Development Kit di Java è distribuito gratuitamente, lo potete scaricare da http://java.sun.com/j2se/1.4.2/download.html o http://java.sun.com/j2se/1.5.0/download.jsp • Si rende necessario un esame autonomo della documentazione fornita dalla Sun: – La documentazione associata al JDK – Il tutorial Java (bucci/sassoli) 2 Parte 1 • • Cosa è Java? Quali sono le sue caratteristiche generali? Java (bucci/sassoli) 3 Java –Semplice e orientato agli oggetti –Interpretato –Architetturalmente neutro e portabile –Robusto –Distribuito –Sicuro –Ad elevate prestazioni (?) –Concorrente (multithread) Indirizzi Utili: • In generale: http://java.sun.com/ • Libro Eckel: http://www.BruceEckel.com Java (bucci/sassoli) 4 SEMPLICE E OO • • Sintassi simile a C e C++ (facile da imparare) Elimina i costrutti più "pericolosi" di C e C++ – – – – – • • aritmetica dei puntatori (de)allocazione esplicita della memoria strutture (struct) definizione di tipi (typedef) preprocessore (#define) Aggiunge garbage collection automatica Conserva la tecnologia OO di base di C++ – C++ dovendo mantenere la compatibilità col C può ancora essere usato per la programmazione procedurale/funzionale – Pure Java mantiene aspetti della programmazione procedurale, ma è impossibile dimenticarsi che si è in un contesto OO (gli stessi programmi sono oggetti!) Java (bucci/sassoli) 5 Interpretato • • Il compilatore produce un codice di tipo intermedio per una “Java Virtual Machine” (“byte-code”) ... … che viene interpretato codice codice sorgente sorgente Java (bucci/sassoli) compilatore compilatore byte bytecode code interprete interprete 6 BYTECODE: ESEMPIO void spin ( ) { int i; for (i = 0; i < 100; i++) { ; } } 0 iconst_0 1 2 5 8 9 11 14 Java (bucci/sassoli) istore_1 goto 8 iinc 1 1 iload_1 bipush 100 if_icmplt 5 return // push int constant 0 // store into local 1 (i=0) // first time, don’t increment // increment local i by 1 (i++) // push local 1 (i) // push int constant (100) // compare, loop if < (I<100) // return void when done 7 ARCHITETTURALMENTE NEUTRO • Il byte-code è indipendente dall’architettura hardware (ANDF: Architecture Neutral Distribution Format) • Pertanto, un programma bytecode può essere eseguito su qualsiasi sistema su cui giri un ambiente run-time Java Java (bucci/sassoli) 8 Esempio Sistema tradizionale eseguibile eseguibile macchina macchinaAA compilatore compilatore macchina macchinaAA codice codice sorgente sorgente compilatore compilatore macchina macchinaBB eseguibile eseguibile macchina macchinaBB ……. Sistema ANDF compilatore compilatore macchina macchinaAA codice codice sorgente sorgente compilatore compilatore macchina macchinaBB ……. Java (bucci/sassoli) interprete interprete macchina macchinaAA byte bytecode code interprete interprete macchina macchinaBB ……. 9 Portabile • Il sistema Java (compilatore + interprete + librerie run-time) è facilmente portabile su piattaforme diverse codice codice sorgente sorgente compilatore compilatore byte bytecode code interprete interprete libreria libreria • • • S.O. il compilatore Java è scritto in Java l’ambiente run-time è scritto in ANSI C con interfacce standard (POSIX) verso il sistema operativo nessuna “implementation dependency” Java (bucci/sassoli) 10 Robusto • • Controlli estensivi a compile-time e a run-time, per rilevare gli errori quanto prima possibile (es.: type checking) Per questo, le caratteristiche insicure di C e C++ sono rimosse: – Nessuna gestione esplicita dei puntatori (no aritmetica dei puntatori, no malloc e free esplicite, …) – Gestione della memoria con garbage collection – Array e stringhe “veri” • Verifica del byte-code a load-time Java (bucci/sassoli) 11 Distribuito • • • Pensato per essere eseguito in rete L’ambiente run-time incorpora funzioni di rete (sia di basso livello: TCP/IP, che di alto livello: HTTP, …) La rete è facilmente accessibile (come i file locali) Approccio tradizionale DATI PROGRAMMI RETE Network computing RETE Java (bucci/sassoli) PROGRAMMI E DATI load and run 12 Sicuro • L’ambiente di esecuzione si protegge da bytecode potenzialmente “ostile” • Esempi: – il bytecode viene verificato prima dell’interpretazione (“theorem prover”), in modo da essere certi di alcune sue caratteristiche – gli indirizzamenti alla memoria nel bytecode sono risolti sotto il controllo dell’interprete Java (bucci/sassoli) 13 COMPILE-LOAD-RUN Loader Loader delle delleclassi classi Sorgente Sorgente Java Java Verifica Verificadel del byte-code byte-code Interprete Interprete Rete Compilatore Compilatore Byte-code Byte-code Java Java Ambiente Ambiente run-time run-time hardware hardware Java (bucci/sassoli) 14 Prestazioni • La verifica del bytecode permette di saltare molti controlli a run-time: l’interprete è pertanto efficiente • Per maggiore efficienza, possibilità compilazione on-the-fly del bytecode in codice macchina • (Molto) Inferiore al C/C++ Java (bucci/sassoli) 15 Compilazione on the fly Loader Loader delle delleclassi classi Sorgente Sorgente Java Java Verifica Verificadel del byte-code byte-code Interprete Interprete Rete Generatore Generatore di dicodice codice Compilatore Compilatore Byte-code Byte-code Java Java Ambiente Ambiente run-time run-time hardware hardware Java (bucci/sassoli) 16 Concorrente • Multithreading parte integrante del linguaggio: – Applicazioni interattive più facili a scriversi – Migliore "reattività" (anche se non real-time) OS OS Task Task 11 Task Task 22 Memoria condivisa Monitor Monitor (interprete (interpreteJava) Java) Thread Thread 11 Thread Thread 22 Thread Thread 33 Memoria condivisa Memoria locale Memoria locale Java (bucci/sassoli) 17 Ben supportato La Standard Library Java contiene una ricca collezione di classi e di metodi preconfezionati: – – – – – – – Language support Utilities Input/output Networking Abstract Window Toolkit (AWT) Swing … Java (bucci/sassoli) 18 Java RoadMap • • • JDK 1.0 JDK 1.0. JDK 1.1 Usata dai browser della vecchia generazione Aggiunge molte estensioni: • Estensioni al linguaggio • NMI, RMI, JDBC, Beans • JDK 1.1.7 • Nella terminologia Java si parla di Java 2 : il termine è stato introdotto a partire dal rilascio del JDK 1.2 • JDK 1.2 – Aggiunge soprattutto JFC (Swing) • Swing • Java 2D A un certo punto hanno aggiunto un 2 • • J2DK 1.4.2 J2DK 5.0 Ultima versione • In realtà si dovrebbe usare la dizione SDK, ma tutti continuano a usare la dizione JDK Java (bucci/sassoli) 19 Parte 2 • Per Iniziare… Java (bucci/sassoli) 20 Per iniziare…. • Procuriamoci (almeno) il Java development kit e la Java api documentation • http://java.sun.com/ JDK – Java Development Kit JRE – Java Runtime Environment JVM – Java Virtual Machine AWT – Abstract Windowing Toolkit JFC – Java Foundation Classes RMI – Remote Method Invocation JDBC – Java Data Base Connectivity BDK – Beans Development Kit ecc Java (bucci/sassoli) 21 Per iniziare… • Procuriamoci un tool per lo sviluppo • Consigliati e free! – JCreator: leggero e facilissimo (ottimo per iniziare) http://www.jcreator.com/ – Eclipse: più pesante, ma completo (vero riferimento per un non-neofita) http://www.eclipse.org/ Java (bucci/sassoli) 22 Un programma di esempio • Il programma HelloWorld //: HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println(“Hello World!”); } } • Compilazione di HelloWorld javac HelloWorld.java • Esecuzione di HelloWorld java HelloWorld Java (bucci/sassoli) //L’estensione è obbligatoria //produce HelloWorld.class //byte-code Byte Code Java Macchina Virtuale (Interprete) Sistema Operativo Hardware 23 Un applet di esempio • L’applet HWApplet //: HWApplet.java import java.applet.Applet; import java.awt.Graphics; public class HWApplet extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 50, 25); } } • Compilazione di HWApplet javac HWApplet.java Java (bucci/sassoli) 24 ..Un applet di esempio • Testo HTML per usare l’applet <HTML> <HEAD> <TITLE> A Simple Program </TITLE> </HEAD> <BODY> Here is the output of my program: <APPLET CODE="HWApplet.class" WIDTH=150 HEIGHT=25> </APPLET> </BODY> </HTML> • Uso del programma appletviewer appletviewer HWApplet.html • Alternativamente si può cliccare su HWApplet.html, oppure fare “drag & drop” Java (bucci/sassoli) 25 Un programma Swing // HWSwing import javax.swing.*; public class HWSwing { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); final JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } Java (bucci/sassoli) 26 Parte 3 • Linguaggio Java Java (bucci/sassoli) 27 Tipi di dati primitivi di Java • Interi byte short int long Wrapper 8-bit two's complement 16-bit two's complement 32-bit two's complement 64-bit two's complement Byte Short Integer Long 32-bit IEEE 754 64-bit IEEE 754 Float Double char boolean 16-bit Unicode character true or false Character Boolean void -- void • Numeri reali float double • Altri tipi Java (bucci/sassoli) 28 Parole Chiave Le seguenti keywords non possono essere usate come identificatori: abstract double int super boolean else interface switch break extends long synchronized byte final native this case finally new throw catch float package throws char for private transient class (goto) protected try (const) if public void continue implements return volatile default import short while do instanceof static Note: - const e goto sono riservate, ma non usate - anche i letterali null, true, false sono riservati Java (bucci/sassoli) 29 Dati Primitivi • Non richiedono l’uso di new per creare un’istanza di quel tipo Sarebbe stato troppo inefficiente dover usare new anche per le semplici variabili: – Con il new gli oggetti vengono messi nell’ heap. – Con la normale dichiarazione vengono messi nello stack. • La sintassi è quella del C/C++ int int double boolean char Java (bucci/sassoli) n, m; Kappa=4; var=32.67; yes; c; // // // // // due variabili intere una variabile intera inizializzata variabile reale inizializzata variabile booleana c è di tipo carattere 30 Statement di controllo • • • • Decisione Ciclo Eccezione Vari if-else, switch-case for, while, do-while try-catch-finally, throw break, continue, label: , return int testscore; char grade; if (testscore >= 90) grade = 'A'; } else if (testscore grade = 'B'; } else if (testscore grade = 'C'; } else if (testscore grade = 'D'; } else { grade = 'F'; } Java (bucci/sassoli) { >= 80) { >= 70) { >= 60) { int month; . . . switch (month) { case 1: System.out.println("January"); break; case 2: System.out.println("February"); break; case 3: . . . . . . . . . case 12: System.out.println("December"); break; default: System.out.println("Hey, that's not a valid month!"); break; } 31 Statement di controllo for (initialization; termination; increment) statements // a è un array . . int i; int length = a.length; for (i = 0; i < length; i++) { . . . // uso dell’elemento i-mo di a . . . } do {statements } while (booleanExpression); int c; Reader in; . . . do { c = in.read(); . . . } while (c != -1); Java (bucci/sassoli) 32 Dati non primitivi • • Sono gli oggetti e gli array. Vengono detti reference types perché essi sono manipolati attraverso riferimenti, ovvero attraverso il loro indirizzo (per esempio passandoli ad un metodo) – Al contrario i dati primitivi vengono sempre passati per valore Le stringhe sono un caso a parte: • • Non sono dati primitivi, ma istanze della classe String Si trattano come dati primitivi – si possono istanziare senza il new – i caratteri della stringa possono apparire tra virgolette e il compilatore li trasforma in stringhe Java (bucci/sassoli) 33 Gli oggetti si manipolano attraverso riferimenti • La dichiarazione String s; non crea un oggetto, ma un handle, cioè un “riferimento” (un puntatore) di nome s ad un oggetto di tipo String. • L’oggetto ancora non esiste. Per mettere in esistenza un oggetto occorre usare new. Ecco alcune possibilità: s = new String(); //crea una oggetto stringa e pone // in s è il riferimento (handle) s = new String(“abcd”); //oggetto creato e inizializzato String s = new String(“abcd”); //dich. e inizializzazione Le stringhe sono un caso speciale e possono essere inizializzate anche senza new: String s = “abcd”; Java (bucci/sassoli) 34 Riferimenti Pippo String s = “Pippo”; s Pippo se viene eseguito lo stat: s = “Pluto”; se viene eseguito lo stat: s = “Paperino”; s Pluto Pippo s Pluto Paperino I riferimenti precedenti in s sono persi (“vittime” del garbage collector) Java (bucci/sassoli) 35 La classe String • In Java le stringhe sono first-class objects mentre in C++ le stringhe sono array di caratteri terminati da ‘\0’ • Al contrario del C++, in Java le stringhe hanno un comportamento affidabile e consistente String e = “”; // stringa vuota String s = “Hello”; String t = new String(“Hello”); String u = new String(s); char[] d = {‘a’, ‘b’, ‘c’}; String v = new String(d); Java (bucci/sassoli) 36 Operazioni sulle stringhe • Concatenazione (+) String v = “Via ”; // stringa vuota String n = “Roma ”; String i = v + n + 2; • Sottostringhe String s = “Hello ”; // stringa vuota String t = s.substring(0, 4); // Hell • Editing int n = s.length(); // 5 char c = s.charAt(4); // ‘o’ String z = s.substring(0, 4) + ‘!’; // Hell! Java (bucci/sassoli) 37 Operazioni sulle stringhe • Confronto tra stringhe String s = “pippo”; String t = “pluto”; boolean b1 = s.equals(t); //false boolean b2 = “pippo”.equals(s); // true String u = “Pippo”; boolean b3 = s.equalsIgnoreCase(u); //true NON USARE == per confrontare due stringhe Java (bucci/sassoli) 38 La classe String System.out.println("Salve"); Il riferimento a un’oggetto String (costante) si ottiene mettendo la stringa tra virgolette “Salve” Riferimento istanza di String (Salve) Oggetto “Salve”.toUpperCase() // toUpperCase() è un metodo della classe String toUpperCase() “Salve” Riferimento istanza di String (Salve) Messaggio Oggetto Java (bucci/sassoli) 39 La classe String public class FaiMaiuscole { public static void main (String argv[]) { System.out.println("Salve: parliamo di stringhe"); System.out.println("una stringa di minuscole".toUpperCase()); } // main } //FAiMaiuscole Riferimento “una stringa. ..le”.toUpperCase() Riferimento Istanza di String (una . . le) Oggetto ricevente Istanza di String (UNA .. LE) Oggetto appena creato “una stringa di minuscole".toUpperCase() non modifica l’oggetto “una stringa di minuscole”, ma crea il nuovo oggetto “UNA STRINGA DI MINUSCOLE” e restituisce il puntatore ad esso Java (bucci/sassoli) 40 La classe String • Una volta creati gli oggetti String non subiscono mai variazioni • • Possono essere concatenati ad altri oggetti della stessa classe, oppure si può ricercare una sotto stringa, etc, ma in questi casi vengono sempre creati nuovi oggetti di classe String gli oggetti di classe String sono immutabili • Esempio S = nome.concat(secnome).concat(cognome); • il messaggio concat(secnome) è inviato a nome. L’oggetto nome restituisce il riferimento al nuovo oggetto (per esempio Carlo Azelio ) • il messaggio concat(cognome) inviato al nuovo oggetto restituisce il riferimento ad un nuovo oggetto (per esempio Carlo Azelio Ciampi ) che è ancora una stringa Java (bucci/sassoli) 41 Scope (dei dati primitivi) • Non esattamente uguale al C { int x = 10; // x è visibile qui { int q = 11; // x e q visibili } // solo x visibile; q non è visibile } { int x = 10; { int x = 11; } //Errore: non è consentito nascondere le variabili // di uno scope più grande } Java (bucci/sassoli) 42 Scope degli oggetti • Gli oggetti restano anche se viene chiuso lo scope in cui vengono istanziati con il new { String s = new String(“La vispa Teresa”) } // fine dello scope di s • • Fuori dallo scope s sparisce, ma l’oggetto stringa esiste ancora nell’heap Non c’è modo di recuperarlo, in quanto si è perso il riferimento • Java possiede un garbage collector. All’occorrenza vengono individuati ed eliminati tutti gli oggetti che non sono più riferiti e la relativa memoria viene resa disponibile. E’ una differenza fondamentale rispetto al C++ • Java (bucci/sassoli) 43 Classi e oggetti • La classe determina come si comportano gli oggetti che ad essa appartengono. class UnTipo { /* corpo della classe */ } Una classe ha – Attributi – Metodi (data members, fields) (function members) class Ora { //attributi int ore; int minuti; int secondi; //Metodi public void setOra(int ore, int minuti, int secondi) ; public final int getOre() ; public final int getMinuti() ; public final int getSecondi() ; public void tick() ; } Java (bucci/sassoli) 44 Classi e oggetti • Un oggetto del classe UnTipo si crea così UnTipo x = new UnTipo(); Ora orario = new Ora(); • • Gli attributi che sono dati primitivi hanno un valore predefinito (default) se non vengono inizializzati (false per i boolean; null per i char; 0 per tutti gli altri). Lo scopo è quello di evitare una usuale fonte di errore Anche i riferimenti hanno il valore predefinito null Java (bucci/sassoli) 45 Metodi • Dichiarazione: returnType methodName (/* argument list */) /* corpo del metodo * } • { I metodi possono essere chiamati solo come membri di un oggetto (con eccezione per quelli dichirati static, esempio: int x = obj.method() //chiamata di method di obj int minuti = orario.GetMinuti(); Si dice che all’oggetto obj viene inviato il messaggio method() • Gli argomenti di un metodo sono variabili (tipo primitivo) o oggetti; le variabili vengono passate per valore, per gli oggetti viene passato il riferimento Java (bucci/sassoli) 46 Invio messaggi/invocazione metodi • Forma generale: <Riferimento>.<messaggio> • Esempio: System.out.println(“un testo”) Riferimento al ricevente Java (bucci/sassoli) Messaggio Metodo Comportamento 47 Static • Quando si definisce una classe si definisce un modello di comportamento. Fino a che non si istanzia un oggetto non si ha nulla di quella classe Può capitare la necessità di aver un solo esemplare di dato o un solo esemplare di metodo, indipendentemente da quanti oggetti sono stati creati. Ciò si ottiene con la parola chiave static esempio attributo statico: alieni attaccano giocatore solo se sono in numero maggiore di 5, la classe alieno avrà un contatore statico, incrementato nel costruttore dell’alieno • Un membro statico non è associato ad alcun oggetto, ma resta associato alla classe Si parla di class data (o class field, class variables) e di class method Java (bucci/sassoli) 48 Attributo statico • • Un attributo statico class StaticData { static int x = 10; } //chiaramente non va nel costruttore Due istanze di StaticData StaticData s1 = new StaticData(); StaticData s2 = new StaticData(); s1.x e s2.x valgono ambedue 10 (sono lo stesso elemento di memoria) • Il modo migliore per fare riferimento a un attributo statico è nominare la classe: StaticData.x++; A questo punto s1.x e s2.x valgono 11 Java (bucci/sassoli) 49 Metodo statico • • • A un metodo statico si può fare riferimento sia nominando un’istanza (un oggetto) che la classe in cui è definito Un metodo statico class StaticMet { static void incr() {StaticData.x++;} } Uso del metodo statico attraverso un oggetto: StaticMet sm = new StaticMet(); sm.incr(); • Uso del metodo statico attraverso la classe: StaticMet.incr(); • L’uso di metodi statici permette la loro chiamata senza che sia stata istanziata la classe. Diventa essenziale per il metodo main() (l’entrata di qualunque applicazione): l’istanziazione della classe che contiene il main() non comporta un main() per ciascuna istanza Java (bucci/sassoli) 50 Ritorniamo al programma di esempio • Il programma HelloWorld //: HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println(“Hello World!”); } } • • Compilazione di HelloWorld javac HelloWorld.java //L’estensione è obbligatoria //produce HelloWorld.class Esecuzione di HelloWorld java HelloWorld Java (bucci/sassoli) 51 Osservazioni sul programma • • • Il file contenente il programma è un’unità di compilazione. Ogni unità di compilazione deve avere l’estensione .java Ogni unità di compilazione deve contenere una classe dichiarata public con lo stesso nome del file (public class HelloWorld) • In un’unità di compilazione ci deve essere una sola classe public (le altre classi non sono visibili dall’esterno (del package); in pratica esse svolgono funzione di supporto per la classe pubblica) La compilazione produce tanti file quante sono le classi dichiarate al suo interno, con estensione .class • • La classe pubblica deve contenere il metodo pubblico main() public static void main(String[] args) { Il metodo è statico (non si deve creare un oggetto HelloWorld per far andare l’applicazione) Il metodo ha come argomento un oggetto che è un vettore di stringhe (l’argomento non viene usato nel programma HelloWorld) Java (bucci/sassoli) 52 .. Osservazioni sul programma • System è una classe della libreria di classi java.lang, questa libreria è automaticamente inclusa in ogni unità di compilazione e le classi in essa contenute rese disponibili Vedere la documentazione Sun [ C:\Java\docs\api\index.html ] e selezionare il package java.lang • Si scopre che System ha un certo numero di field (attributi) e che uno di questi è il campo out • out è uno static PrintStream. Trattandosi di un attributo statico non c’è niente da creare (è un attributo della classe System), si può usare direttamente. • Quel che si può fare con out è determinato dal suo tipo: PrintStream • La classe PrintStream (occorre navigare nella documentazione Sun) presenta diversi metodi, tra cui println • println accetta diversi tipi di argomenti, in particolare accetta le stringhe Java (bucci/sassoli) 53 Nella documentazione Java (bucci/sassoli) 54 ... Java (bucci/sassoli) 55 Java (bucci/sassoli) 56 Java (bucci/sassoli) 57 Esempio: argomenti al main public class Argomenti { public static void main(String args[]) { for(int i = 0; i < args.length; i++) System.out.println(args[i]); } } • Stampa gli argomenti: >java Argomenti un due tre >un >due >tre Java (bucci/sassoli) 58 Esempio: lettura proprietà del sistema // Property.java // Dal libro di B. Eckel “Thinking in Java” import java.util.*; public class Property { public static void main(String[] args) { System.out.println(new Date()); Properties p = System.getProperties(); p.list(System.out); System.out.println("--- Memory Usage:"); Runtime rt = Runtime.getRuntime(); System.out.println("Total Memory = " + rt.totalMemory() + " Free Memory = " + rt.freeMemory()); } } Java (bucci/sassoli) 59 Osservazioni • import java.util.*; importa le classi nel package util (quelle del package java.lang sono comunque importate) • System.out.println(new Date()); crea un oggetto Date e lo passa come argomento a println. Quando lo statement è finito l’oggetto Date non serve più e, non essendoci riferimento ad esso, il garbage collector lo può togliere di mezzo • Date appartiene al package java.util. import java.util.Date Si poteva scrivere • System presenta il metodo statico getProperties() che restituisce un oggetto di tipo Properties (le proprietà del sistema). Essendo il metodo statico, non c’è bisogno di istanziare niente • Navigando si trova che Properties ha il metodo list() che lista le proprietà sull’oggetto PrintStream passato come argomento Java (bucci/sassoli) 60 Osservazioni • Analogo discorso per la classe Runtime e il relativo metodo statico get.Runtime() • totalMemory e freeMemory sono metodi non statici di Runtime • Notare l’uso dell’operatore + per le stringhe (operator overloading: è un’eccezione, diversamente dal C++ Java non consente l’overloading degli operatori) Java (bucci/sassoli) 61 Cosa si legge navigando in DOCS • Al package java.lang per la classe System si trova static PrintStream out The "standard" output stream • Andando a PrintStream si trovano una gran quantità di println, tra cui void print(String s) Print a string. void println(Object x) Print an Object and then terminate the line. • Per la classe Runtime si trova getRuntime public static Runtime getRuntime() Returns the runtime object associated with the current Java application. Most of the methods of class Runtime are instance methods and must be invoked with respect to the current runtime object. Returns: the Runtime object associated with the current Java application. Java (bucci/sassoli) 62 Documentazione • • Formato standard Usa i commenti – // commento stile C++ – /* commento stile C */ – /** commento javadoc */ • javadoc crea la documentazione in HTML (considera solo i commenti per membri public e private) /** A class comment */ public class Aclass { /** A variable comment */ public int x; /** A method comment */ public void f() {} } • Altra possibilità è usare @ • @see classname Crea un iper link • @see fully-qualified-classname#method-name Crea un iper link • e altri modi Java (bucci/sassoli) 63 Esempio documentato // PropertyCommentato.java /** Questo esempio è tratto dal libro di B. Eckel “Thinking in Java”. Il libro è scaricabile da Internet all’indirizzo http://www.BruceEckel.com */ import java.util.*; /** presenta sullo standard output una lunga lista di proprità del sistema Java in uso, più dati relativi alla memoria */ public class PropertyCommentato { /** Embedded HTML * <ol> * <li> Uno * <li> Due * </ol> */ public static void main(String[] args) { System.out.println(new Date()); Properties p = System.getProperties(); p.list(System.out); System.out.println("--- Memory Usage:"); Runtime rt = Runtime.getRuntime(); System.out.println("Total Memory = " + rt.totalMemory() + " Free Memory = " + rt.freeMemory()); } } Java (bucci/sassoli) Provare a sottoporlo a javadoc ed esaminare il risultato 64 Costruttori e altro • Esempio di classe public class Cerchio{ public double x, y; public double r; //coord del centro // raggio //metodi che valutano circonferenza e area public double circonf() { return 2 * 3.14 * r; } public double area(){ return 3.14 * r * r;} } Java (bucci/sassoli) 65 ... Costruttori e altro • Uso di Cerchio double A; Cerchio c = new Cerchio(); c.x = 2.0; //inizializzazione (ascissa del centro) c.y = 4.0; c.r = 1.0; A = c.area(); • Quando si è scritto: Cerchio c = new Cerchio(); Si è usato il costruttore implicito della classe. • • • Un costruttore e’ un metodo che ha sempre il nome della classe E' possibile dichiarare costruttori in modo esplicito E' possibile dichiarare più di un costruttore per una stessa classe Java (bucci/sassoli) 66 ... Costruttori e altro La componente r dell’oggetto public class Cerchio{ public double x, y; //coord del centro public double r; // raggio public Cerchio(double x, double y, double r){ this.x = x; this.y = y; this.r =r;} //costruttore public double circonf() { return 2 * 3.14 * r; } public double area() { return 3.14 * r * r ;} Il parametro r } • Questa volta il costruttore inizializza il cerchio Cerchio c = new Cerchio(1.3, 17.0, 10.0); • E' il cerchio che ha coordinate (1.3, 17.0) e raggio 10.0 E’ un overloading dei metodi (in questo caso costruttori) Java (bucci/sassoli) 67 Overloading dei metodi • Con lo stesso nome si denotano metodi che fanno cose diverse (possibilmente non del tutto scorrelate!) void metodo () void metodo (int a) void metodo (int a, int b) • Nel caso dei costruttori equivale a dare la possibilità di costruire gli oggetti della stessa classe in modi diversi (vedi esempio precedente) • La distinzione avviene sulla base della lista degli argomenti. Ogni costruttore (o metodo, nel caso generale) deve avere una lista di argomenti differente dagli altri. void metodo (int i, float f) è diverso da void metodo (float f, int i) Java (bucci/sassoli) 68 Overloading dei metodi //: Overloading.java import java.util.*; class Tree { int height; Tree() { prt("Planting a seedling"); height = 0; } Tree(int i) { prt("Creating new Tree that is ” + i + " feet tall"); height = i;} void info() { prt("Tree is " + height + " feet tall");} void info(String s) { prt(s + ": Tree is " + height + " feet tall"); } static void prt(String s) { System.out.println(s); } } // Segue a destra Java (bucci/sassoli) // segue da sinistra public class Overloading { public static void main(String[] args) { for(int i = 0; i < 5; i++) { Tree t = new Tree(i); t.info(); t.info("overloaded method"); } // Overloaded constructor: new Tree(); } } 69 Java (bucci/sassoli) 70 Il metodo equals public class Test { public static void main(String a[]) { new Test(); } Test() { P p1=new P(); p1.x=1; p1.y=2; P p2=new P(); p2.x=1; p2.y=2; // come testare l'uguaglianza di p1 e p2? } } Java (bucci/sassoli) 71 Il metodo equals e == public class Test { public static void main(String[] a)}new Test();} Test() { P p1=new P(); p1.x=1; P1.y=2; P p2=new P(); p2.x=1; p2.y=2; System.out.println(p1 == p2); // stampa “false” System.out.println(p1.equals(p2)); // stampa “true” } } Java (bucci/sassoli) 72 Il metodo equals • The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any reference values x and y, this method returns true if and only if x and y refer to the same object (x==y has the value true). Chiaramente se ne può fare un override Java (bucci/sassoli) 73 Costanti • • • Si usa la parola final. Due aspetti: – una costante definita al tempo di compilazione – una costante definita al tempo di esecuzione che non deve essere più modificata Il primo caso è l’equivalente del #define del C. La costante PI del package matematico (java.lang.Math.PI): public class Math{ …. public static final double PI = 3.14159; ….} Nel secondo caso la costante deve essere inizializzata a run time. Può essere usata per un riferimento, nel qual caso punta sempre allo stesso oggetto (che, ovviamente, può essere modificato) Java (bucci/sassoli) 74 Costanti • La parola final può esser usata anche per gli argomenti dei metodi, per i metodi e per le classi – Se l’argomento è un riferimento ad un oggetto, dichiararlo final lo rende non modificabile (al ritorno dal metodo l’argomento punta sempre allo stesso oggetto, che tuttavia può essere modificato) – Un metodo dichiarato final non può esser modificato nelle classi derivate – Una classe final è una classe che non può essere usata per derivare altre classi. Java (bucci/sassoli) 75 .. Costanti //: FinalData.java class Value { int i = 1; } public class FinalData { final int i1 = 9; static final int I2 = 99; public static final int I3 = 39; } Value v1 = new Value(); final Value v2 = new Value(); //v2 riferimento non modificabile static final Value v3 = new Value(); //! final Value v4; // Error: deve essere inizializzata public static void main(String[] args) { FinalData fd1 = new FinalData(); //! fd1.i1++; // Error: non può cambiare fd1.v2.i++; // l’oggetto riferiro da v2 non è una costante fd1.v1 = new Value(); // OK -- not final // fd1.v2 = new Value(); // NO -- final } Java (bucci/sassoli) 76 Array int[] a;//dichiarazione di un vettore di interi • Notare che non si danno le dimensioni; la dichiarazione costituisce definizione di un riferimento (handle) ad un array. Occorre inizializzare. Ci sono due modi: usare new oppure assegnare valori : int[] a1 ={ 1, 2, 3, 4}; • Se si dichiara int[] a2; e si scrive a1 = a2; si copia un riferimento non l’array! (Lo stesso concetto vale ovviamente se a1 e a2 fossero handle a generici oggetti) a1 a2 Java (bucci/sassoli) 1,2,3,4 a1 1,2,3,4 a2 1,2,3,4 77 Array public class Arrays { public static void main(String[] args) { int[] a1 = { 1, 2, 3, 4, 5 }; int[] a2; a2 = a1; for(int i = 0; i < a2.length; i++) a2[i]++; //sto incrementando anche i dati di a1!! for(int i = 0; i < a1.length; i++) prt("a1[" + i + "] = " + a1[i]); } static void prt(String s) {System.out.println(s);} } a1 a2 1,2,3,4,5 a1 2,3,4,5,6 1,2,3,4,5 a2 Java (bucci/sassoli) a2 78 .. Array - Inizializzazione • Di dati primitivi – int[] a = { 1, 2, 3 } // aggregazione di oggetti – Qui di seguito si crea un array la cui dimensione è fissata al tempo di esecuzione: int[] a; a = new int[iRand()]// iRand riporta un numero intero • Di Oggetti – Ogg[] Q;// definisce un vettore di riferimenti a oggetti Ogg – Q = new Ogg[20] // alloca 20 riferimenti ad oggetti di classe Ogg Inizializzazione dei componenti l’array di oggetti Q[0] = new Ogg(); Q[1] = new Ogg(/*parametri del costruttore*/); …. Oppure MyClass[] Java (bucci/sassoli) mc = { new MyClass(); new MyClass(“bella”); new MyClass(“brutta”); ….} 79 Package • Più classi o interfacce interrelate possono essere riunite in un package, dotato di nome • Conviene raccogliere le classi in un package – per tenere assieme tutte le classi che provvedono funzionalità correlate – per evitare collisione di nomi con altre classi: il package rappresenta uno specifico spazio dei nomi (namespace) – per definire regole di accesso alle classi nel package e tra di loro Esempio: MyPackage classe o interfaccia c b a d Java (bucci/sassoli) e 80 Alcuni Packages Standard java.lang classi base del linguaggio java.io classi di I/O java.util classi di utilità java.net java.applet classi di supporto alle applicazioni di rete (socket, URL, …) classe Applet, … java.awt Abstract Windowing Toolkit Java (bucci/sassoli) (Object, Thread, Throwable, System, String, Math, …) (FileInputStream, FileOutputStream, ) (Date, Random, …) 81 Lo Statement package • Specifica che le classi che seguono appartengono a un certo package • Deve apparire (una sola volta) all’inizio di una unità di compilazione Esempio: a.java package p; class a {.. class b {... class c {.. Java (bucci/sassoli) le classi a,b,c appartengono al package p Se lo statement è omesso, la classe appartiene al package anonimo 82 Lo Statement package • Supponiamo di voler costruire il componente di libreria mypack e supponiamo che in esso si voglia avere le classi MyC1 e MyC2: package mypack; // primo statement (non di commento) dei file MyC1.java, public class MyC1 {.. // MyC1 è accessibile dall’esterno del package package mypack; // primo statement (non di commento) dei file MyC2.java, public class MyC2{.. // MyC2 è accessibile dall’esterno del package Java (bucci/sassoli) 83 Nomi di Package: Fully Qualified Name • Il nome di un package può essere composto da più identificatori separati da “.”: luigi.utilities.internet • I progettisti hanno definito una regola per assegnare nomi univoci su tutta la rete Internet (dovendo essere possibile il caricamento di una classe da qualunque posizione della rete) • La regola è quella di utilizzare l’indirizzo Internet • Fully Qualified Name: it.unifi.dsi.luigi.utilities.internet nome di dominio Cui corrisponde il percorso it\unifi\dsi\luigi\utilities\internet Java (bucci/sassoli) 84 Lo Statement import • Per evitare di usare sempre nomi completi di classi, si può usare lo statement import Esempio: class MyClass { java.util.Date today; … } import java.util.Date; class MyClass { Date today; ... } Note: • import java.util.* importa tutte le classi del package java.util • java.lang.* è sempre importato implicitamente Java (bucci/sassoli) 85 PACKAGE E DIRECTORY • Molti ambienti Java mappano i nomi dei package sui pathname del file system (compilatore e class loader) Esempio: aaa.bbb.ccc.MyClass package classe aaa/bbb/ccc/MyClass directories file pathname Java (bucci/sassoli) 86 VISIBILITA’ Classi e interfacce • sono visibili all’interno del package in cui sono dichiarate; sono visibili all’esterno del package solo se dichiarate public public class a { … public interface b { … Membri (campi e metodi) • sono visibili quando: – la loro classe è visibile e – il loro modificatore li rende visibili Java (bucci/sassoli) 87 più visibile VISIBILITA’ DI CAMPI E METODI Modificatore Visibilità private solo nella classe in cui è definito nessuno (default) solo nelle classi del package protected classi nel package e sottoclassi (stesso package o altri package) public tutte le classi NB: I membri di una interfaccia sono sempre pubblici Java (bucci/sassoli) 88 ESEMPIO package pac class a {... class b { private int i; private void m( ) {…} int j; visibile void n( ) {…} public int k; public p( ){…} protected int i; protected void m( ){…} class c {... class classddextends extendsbb{... {... class e extends d {... Java (bucci/sassoli) 89 PROGETTARE LA VISIBILITA’ Quando progettiamo una classe dobbiamo pensare a due tipi di utenti: • quelli che utilizzeranno la classe per realizzare delle applicazioni • quelli che estenderanno la classe per realizzare sottoclassi • I primi useranno i membri public; i secondi anche i membri protected • Le interfacce public e protected vanno progettate con cura Java (bucci/sassoli) 90 Java Class Path • • • • • L’interprete java sa dove cercare le classi di sistema Per default le classi di utente sono cercate nella cartella corrente E’ possibile attraverso la variabile di environment ClassPath definire percorsi per le classi di utente. L’interprete cerca prima nel ClassPath e poi nelle cartelle delle classi di sistema La variabile ClassPath deve specificare una cartella o file Zip o Jar contenenti le classi Esempio: set classpath .;c:\documenti\corsi\IS\java;c:\documenti\corsi\MM\esempi.zip Il classpath può essere specificato anche attraverso la linea di comando di javac Java (bucci/sassoli) 91 Name Space: Nomi dei file java e delle directories • • File java sorgente: – statement package opzionale – eventuali import – una o più definizioni di classi (o di interfacce) Ogni classe e ogni interfaccia è compilata (in bytecode ) come file a se’ stante, detto class file. I class file hanno lo stesso nome della classe e l’estensione .class Java (bucci/sassoli) 92 Name Space: Nomi dei file java e delle directories • I nomi dei package sono di norma composti di più parti separate da punti. Esempio: package: lezioni.grafica class file: cubo metodo: volume() il fully qualified name del metodo sarebbe lezioni.grafica.cubo.volume() • I class file vengono memorizzati in una cartella il cui percorso (relativo al classpath) ha la stessa struttura del fully qualified name. Esempio: Il path della classe cubo sarebbe : lezioni/grafica/cubo.class Il path è da interpretarsi come relativo al classpath: viene concatenato ai vari percorsi di quest’ultimo Java (bucci/sassoli) 93 Classi-Ereditarietà • Niente ereditarietà multipla • Keyword “extends” – class Figlio extends Padre {} • La classe Figlio è una sottoclasse dalla classe Padre • Keyword “abstract” – abstract class Astratta {} • La classe Astratta non può essere istanziata – abstract void Metodo(); • Il metodo astratto Metodo rende non istanziabile la classe che lo definisce Java (bucci/sassoli) 94 .. Classi- Ereditarietà • • • Faremo un esercizio quasi completo, che illustrerà oltre all’ereditarietà anche il meccanismo dei package (e la documentazione con Javadoc). Le classi vengono tutte messe nel package it.unifi.dsi.Bucci Si usano i nomi completamente specificati (fully qualified) • Supponiamo che si abbia questa questa classe (definiremo tra un po’ i metodi) class Ora { int ore; int minuti; int secondi; public void setOra(int ore, int minuti, int secondi) ; public final int getOre() ; Non possono esser modificati public final int getMinuti() ; essendo final public final int getSecondi() ; public void tick() ; } Nota: Questo esempio è adattato da uno presente sul libro di Sciabarrà (disponibile in rete) Java (bucci/sassoli) 95 ... La classe Ora //: Ora.java package it.unifi.dsi.Bucci; // Definizione della classe Ora /** La *@see */ public int } classe Ora aggiorna i secondi (e, se serve, i minuti e l'ora) ad ogni tick OraPrecisa class Ora { ore, minuti, secondi; public void setOra(int ore, int minuti, int secondi) { this.ore= (ore <0 || ore >24) ? 0 : ore; this.minuti= (minuti<0 || minuti > 60) ? 0 : minuti; this.secondi= (secondi<0 || secondi >60) ? 0 : secondi; } public final int getOre() { return ore; } public final int getMinuti() { return minuti; } public final int getSecondi() { return secondi; } public void tick() { if(++secondi==60) { secondi=0; if(++minuti==60){ minuti=0; if(++ore==24) ore=0;}}} Java (bucci/sassoli) 96 ... La classe OraPrecisa //: OraPrecisa.java package it.unifi.dsi.Bucci; // La classe OraPrecisa derivata da Ora // Essa gestisce anche i centesimi di secondo public class OraPrecisa extends Ora { private int centesimi; public OraPrecisa() { Costruttore della superclasse super(); centesimi = 0; } public void setOra(int o, int m, int s, int c) { super.setOra(o, m, s); metodo della superclasse centesimi= (c <0 || c >99) ? 0 : c; } public final int getCentesimi() { return centesimi; } public void tick() { if(++centesimi==100) { centesimi=0; super.tick(); } } } Il tick è dato qui per i centesimi per il resto in Ora Java (bucci/sassoli) 97 La classe ProvaOra //: ProvaOra.java package it.unifi.dsi.Bucci; /** per la prova di Ora */ public class ProvaOra { public static void main (String argv[]) { Ora h = new Ora(); h.setOra(11,112,10); System.out.println("Ore: " + h.ore +":" + h.minuti + ":" + h.secondi); for (int i=0; i<3; i++) { h.tick(); System.out.println("Ore: " + h.getOre() +":" + h.minuti + ":" + h.secondi); } OraPrecisa hp = new OraPrecisa(); hp.setOra(333,10,7,97); System.out.println("OrePrec: " + hp.ore +":" + hp.minuti + ":" + hp.secondi + ":" + hp.getCentesimi()); for (int i=0; i<4; i++) { hp.tick(); System.out.println("OrePrec: " + hp.ore +":" + hp.minuti + ":" + hp.secondi + ":" + hp.getCentesimi()); } } } Java (bucci/sassoli) 98 Package, cartelle e altro …. • La cartella di lavoro è Ora. In essa ci sono tre sottocartelle e i file .bat per semplificare le fasi di comando Java (bucci/sassoli) 99 Percorso • I file sorgente sono nella cartella Src\it\unifi\dsi\Bucci • In tutti i file c’è: • Per compilare è stato costruito il file di comando Java (bucci/sassoli) package it.unifi.dsi.Bucci; compile.bat nella cartella Ora 100 Compilazione Compile.bat cd src javac -d ../bin it/unifi/dsi/Bucci/*.java cd .. –Cliccando su compile.bat I file .class finiscono nella cartella bin/it/unifi/dsi/Bucci del comando viene creata da javac) Java (bucci/sassoli) (se non esiste all’atto 101 .. Esecuzione Per l’esecuzione c’è il file run.bat cd bin java it/unifi/dsi/Bucci/ProvaOra cd .. Ore: 11:0:10 Ore: 11:0:11 Ore: 11:0:12 Ore: 11:0:13 OrePrec: 0:10:7:97 OrePrec: 0:10:7:98 OrePrec: 0:10:7:99 OrePrec: 0:10:8:0 OrePrec: 0:10:8:1 Java (bucci/sassoli) 102 .. Documentazione File documenta.bat: cd src javadoc -d ../Docs it/unifi/dsi/Bucci/*.java cd .. Mantiene la stessa struttura In questi non c’è niente Java (bucci/sassoli) 103 .. Documentazione Questo viene dal *@see OraPrecisa Java (bucci/sassoli) 104 I/O (Fino a questo punto abbiamo solo stampato) • Il modo di trattate l’I/O è questo tr S t pu t Ou dati Programma Java Programma Java Java (bucci/sassoli) Dispositivo di uscita m ea Dispositivo di ingresso ea r t tS u p in m 105 ..I/O • Nel caso dell’output su standard out le cose sono semplici: – System.out (lo standard output) è un PrintStream, che a sua volta è un OutputStream PrintStream presenta alcuni metodi, tra cui println(String s) che abbiamo usato • Nel caso dell’ingresso le cose sono un po’ più complicate: Per rappresentare il flusso di ingresso da tastiera Java prevede un oggetto BufferedInputStream System.in (lo standard input) è un InputStream – Si costruisce un oggetto BufferedInputStream che modella un flusso di dati che proviene da tastiera o da rete (per questo si si serve di – Si costruisce l’oggetto InputStreamReader per modellare un flusso di caratteri (adatto a formare Stringhe) – Si usa InputStreamReader per costruire l’oggetto BufferedReader al quale si può inviare il messaggio readLine() per leggere una riga come stringa di caratteri Java (bucci/sassoli) 106 ..I/O (Input) • Da Tastiera Tastiera (System.in) InputStream isr InputStreamReader keyb BufferedReader • (AppenaCreato) (Appena Creato) Nel caso di ingresso da file le cose sono simili; al posto della classe InputStream si deve usare la classe FileInputStream Java (bucci/sassoli) 107 ..I/O (input da tastiera) • Esempio: import java.io.*; .. .. .. .. .. InputStreamReader isr; BufferedReader keyb; String Inputline; //modella una tastiera che legge un //flusso di caratteri //modella una tastiera che legge //le linee come String //Modella una linea di ingresso isr = new InputStreamReader(System.in); keyb = new BufferedReader(isr); Inputline = keyb.readLine(); Java (bucci/sassoli) 108 Ingresso di interi Interi: Occorre trasformare la stringa in un numero intero. Si usa il metodo static parseInt(String s) della classe Integer String s = keyb.readLine(); int i = Integer.parse.Int(s); Più sinteticamente int i = Integer.parse.Int(keyb.readLine()); • Per funzionare la linea deve poter essere trasformata in intero altrimenti si ha errore (exception): occorre il throws public int read(BufferedReader br) throws Exception { int dato = Integer.parse.Int(br.readLine()); return(dato); } Java (bucci/sassoli) 109 Ingresso Float, Double • • • Non c’è un parse.Double, né un parse.Float si crea un oggetto Double (oggetto, non valore primitivo) si manda all’oggetto il messaggio doubleValue() String s = keyb.readLine(); Double d = Double.valueOf(s); double x = d.doubleValue(); //ValueOf: metodo statico di Double Ovvero: double x = Double.valueOf(s).doubleValue(); Meglio ancora: double x = Double.valueOf(keyb.readLine()).doubleValue(); Mostruoso: double x = Double.valueOf(new BufferedReader(new InputStreamReader(System.in)).readLine()).doubleValue(); Java (bucci/sassoli) 110 Ora con ingresso public class ProvaOra { static int get(String s) throws Exception { InputStreamReader isr; BufferedReader keyb; isr = new InputStreamReader(System.in); keyb = new BufferedReader(isr); System.out.println(s); inl = keyb.readLine(); return Integer.parseInt(inl); } String inl; public static void main (String argv[]) throws Exception{ int ora, min, sec, cent; Ora h = new Ora(); ora = get("Batti l'ora"); min = get("Batti i minuti"); sec = get("Batti i secondi"); h.setOra(ora, min, sec); System.out.println("Ore: " + h.ore +":" + h.minuti + ":" + h.secondi); ……Come prima Java (bucci/sassoli) 111 Polimorfismo • • • Java effettua Utilizza il dynamic binding (late binding): al tempo di esecuzione si determina quale è lo specifico metodo (il codice) da eseguire. Il polimorfismo richiede le classi astratte Keyword “abstract” – abstract class Astratta {} • La classe Astratta non può essere istanziata, anche se nessuno dei suoi metodi è astratto – abstract void Metodo(); • • • Il metodo astratto Metodo rende non istanziabile la classe che lo definisce Una sottoclasse di una classe astratta può essere istanziata se ridefinisce tutti i metodi della superclasse e fornisce l’implementazione di ciascuno di essi Una sottoclasse che non implementa tutti i metodi della classe astratta da cui deriva è essa stessa una classe astratta e non può essere istanziata. Java (bucci/sassoli) 112 Classi astratte: esempio //: ProvaForme.java // Polimorfismo in Java abstract public public public } class Forma { abstract double area(); abstract double perimetro(); abstract void presente() ; • …SEGUE • Notare che i metodi astratti non hanno un corpo definito. Dopo le parentesi c’è “;” Java (bucci/sassoli) 113 .. Classi astratte: esempio class Cerchio extends Forma { protected double r; protected static final double PI = 3.14; public Cerchio() {r=1.0;} public Cerchio(double r) {this.r = r;} public double area() {return PI * r * r;} public double perimetro() {return 2* PI * r;} public double getR() {return r;} public void presente() { System.out.println("Cerchio.presente()"); } } //costante //costruttore //costruttore class Rettangolo extends Forma { protected double b, h; public Rettangolo() {b=1.0; h=0.0;} public Rettangolo(double b, double h) {this.b = b; this.h= h;} public double perimetro() {return 2 * (b+h);} public double area() {return b * h;} public double getB() {return b;} public double getH() {return h;} public void presente() { System.out.println("Rettangolo.presente()"); } } Java (bucci/sassoli) SEGUE 114 .. Classi astratte: esempio public class ProvaForme { public static void main (String argv[]) { Forma[] Forme = new Forma[4]; Forme[0] = new Cerchio(); Forme[0].presente(); //prenderà il metodo di cerchio Forme[1] = new Cerchio(3.0); Forme[2] = new Rettangolo(); Forme[3] = new Rettangolo(6.1, 7.9); Forme[3].presente(); //metodo di rettangolo double AT = 0; double PT = 0; for (int i=0; i<Forme.length; i++) { AT = AT + Forme[i].area(); PT += Forme[i].perimetro(); } System.out.println("Area Totale: " + AT); System.out.println("Perimetro Totale: " + PT); // double B = Forme[2].getB(); } ERRORE: non è in Forma } Java (bucci/sassoli) 115 Interfacce • • In Java non c’è l’ereditarietà multipla Il meccanismo delle interfacce consente una sorta di derivazione multipla, ma senza i problemi che essa comporta • Un’interfaccia dice come si comporta una classe che la implementa • “Un’interfaccia fornisce un’interfaccia” (è un reference type) • Le interfacce sono classi puramente astratte – servono come definizione dei metodi, tutti senza corpo e tutti astratti anche se non si dichiarano abstract; tutti i metodi di un’interfaccia sono implicitamente definiti public – possono contenere dati, ma questi sono implicitamente static e final cioè costanti di classe Java (bucci/sassoli) 116 Dichiarazione • • Il corpo contiene definizioni di costanti e di metodi I metodi NON hanno corpo: sola definizione final String _nome = “pincopallino”; void unmetodo(String s, int i); //senza Java (bucci/sassoli) 117 Interfacce • Keyword “interface” interface Disegnabile { void draw(Window w); } • Keyword “implements” class RettangoloDisegnabile implements Disegnabile { void draw(Window w) {...} //implementazione del metodo } • La classe Rettangolo per essere istanziabile deve implementare tutti i metodi di Disegnabile Java (bucci/sassoli) 118 ..Interfacce • • Supponiamo che le nostre forme debbano essere disegnabili Potremmo definire una classe astratta Disegnabile, con i metodi adatti per il disegno e derivare le classi CerchioDisegnabile, RettangoloDisegnabile, etc. – Equivale a buttare via il lavoro precedente • Supponiamo che si vogliano ancora i metodi area e perimetro, ma non si voglia riscriverli. Non è possibile rendere CerchioDisegnabile sottoclasse di Disegnabile e di Cerchio: in Java l’eredità multipla non è consetita • Tuttavia possiamo: – Definire un’interfaccia Disegnabile; – Derivare CerchioDisegnabile da Cerchio – Fare implementare a CerchioDisegnabile l’interfaccia Disegnabile Java (bucci/sassoli) 119 ..Interfacce: esempio • L’interfaccia Disegnabile // : Disegnabile.java public interface Disegnabile { void draw(); void setColor(Color c); void setPosizione(double x, double y); } Java (bucci/sassoli) 120 ..Interfacce: esempio //: ProvaFormeDis.java class CerchioDisegnabile extends Cerchio implements Disegnabile { private double x, y; //posizione private Color c; //colore public CerchioDisegnabile(double r) {super(r);} // costruttore // implementazione dei metodi dell'interfaccia public void setColor(Color c) {this.c =c;} public void setPosizione(double x, double y) {this.x = x; this.y = y;} public void draw() { System.out.println("CerchioDisegnabile.draw(); Colore:" + c.k + "; Posizione: " + x +","+y); } Implementazione dei metodi di interfaccia. Sono ereditati i metodi della superclasse }//CerchioDisegnabile • SEGUE Java (bucci/sassoli) 121 // SEGUE ProvaFormeDis.java class RettangoloDisegnabile extends Rettangolo implements Disegnabile { private double x, y; private Color c; public RettangoloDisegnabile(double b, double h) {super(b, h);} costruttore // // implementazione dei metodi dell'interfaccia public void setColor(Color c) {this.c =c;} public void setPosizione(double x, double y) {this.x = x; this.y = y;} public void draw() { System.out.println("RettangoloDisegnabile.draw(); Colore:" + c.k + "; Posizione: " + x +","+y); } } //RettangoloDisegnabile Java (bucci/sassoli) 122 // SEGUE ProvaFormeDis.java class Color { //il colore int k; Color(int k) {this.k= k;} } Java (bucci/sassoli) 123 // SEGUE ProvaFormeDis.java public class ProvaFormeDis{ public static void main (String argv[]) { Forma[] Forme = new Forma[2]; //vettore di forme (non disegnabili) Disegnabile[] Disegnabili = new Disegnabile[2]; //vettore di disegnabili CerchioDisegnabile Cd = new CerchioDisegnabile(5.5); RettangoloDisegnabile Rd = new RettangoloDisegnabile(10,10); Forme[0] = Cd; Forme[1] = Rd; double AT = 0.; Disegnabili[0] = Cd; Disegnabili[1] = Rd; double PT = 0.; for (int i= 0; i<Forme.length; i++) { AT = AT + Forme[i].area(); PT += Forme[i].perimetro(); Disegnabili[i].setPosizione(i*10.0, i*5.0); Disegnabili[i].setColor(new Color(i)); Disegnabili[i].draw();} System.out.println("Area Totale: " + AT); System.out.println("Perimetro Totale: " + PT); Java (bucci/sassoli) } } 124 Interfacce multiple • • Si può derivare da una sola classe, ma si possono avere quante interfacce si vogliono L’interfaccia non ha associata memoria (eccetto le costanti) e quindi non si pongono problemi come nel caso dell’ereditarietà multipla del C++ Classe base astratta o concreta interface 1 interface 2 interface n Classe derivata • implem. 1 implem. 2 .… implem. n Da un’interfaccia si può derivare una nuova interfaccia, come pure derivare l’interfaccia da più di una interfaccia Java (bucci/sassoli) 125 Interfacce multiple: forme disegnabili e colorabili // : DisegnabileEcolorabile.java interface Disegnabile { void draw(); void setPosizione(double x, double y); } interface Colorabile{ void modColor(); } Java (bucci/sassoli) 126 ….forme disegnabili e colorabili //: DisegnabiliEColorabili class CerchioDiscolo extends Cerchio implements Disegnabile, Colorabile { private double x, y; private Color c; public CerchioDiscolo(double r, Color c) { super(r); this.c =c; System.out.println("CerchioDiscolo: Colore Iniziale: " + c.k); } // costruttore public void setPosizione(double x, double y) {this.x = x; this.y = y;} public void draw() { System.out.println("CerchioDiscolo.draw(); Posizione: " + x +","+y + " Colore:" + this.c.k ); } public void modColor() {++this.c.k; System.out.println("CerchioDiscolo.modColor(); Colore:" + this.c.k ); } }//CerchioDiscolo Java (bucci/sassoli) 127 Trattamento degli errori (Exception handling) • • Simile al C++ Terminologia: – Exception: un segnale che indica che si è verificata qualche condizione eccezionale (per esempio un errore, una divisione per 0) – To throw an exception: segnalare che si è verificata la condizione eccezionale – To cactch an exception: trattare la cosa prendendo i provvedimenti adeguati • • Quando si verifica l’eccezione il contesto corrente viene abbandonato, l’eccezione si propaga attraverso la struttura a blocchi. Se non viene catturata dal blocco di codice che la ha determinata, l’eccezione si propaga a livello superiore (al metodo chiamante) e così via. Alla fine arriva al main e se non viene catturata, l’interprete stampa un messaggio di errore, la traccia dello stack ed abbandona il programma Il meccanismo delle eccezioni consente di localizzare in un unico punto il trattamento delle condizioni anomale Java (bucci/sassoli) 128 Exception handling • Il meccanismo si basa su try/catch/finally: • try: definisce il blocco di codice che può avere eccezioni al suo interno try { /* codice che potrebbe generare eccezioni */} • catch: una o più clausole catch possono seguire il blocco try. Il codice nel catch deve svolgere le azioni ritenute appropriate per trattare l’eccezione Hanno un argomento che deve essere di tipo Throvable (o derivato): in presenza di un’eccezione viene invocata la prima clausola catch che ha un argomento dello stesso tipo. (non è necessario avere un catch per tutte le possibili eccezioni) catch (UnEccezione e1){ /* tratta l’oggetto e1 di tipo UnEccezione o sua sottoclasse*/} catch (AltraEccezione e2){ /* tratta l’oggetto e2 di tipo AltraEccezione o sua sottoclasse*/} catch (FileNotFoundException e) {/* potrebbe chiedere di ribattere il nome del file*/ } Java (bucci/sassoli) 129 STRUTTURA try-catch-finally try blocco-0 catch (exception_type1 id) blocco-1 catch (exception_type2 id) block-2 … finally blocco-n qui dentro viene segnalata la eccezione, con throw e blocco-0 exception_type1 exception_type2 blocco-1 blocco-2 blocco-n Java (bucci/sassoli) 130 LA SEGNALAZIONE DELLE ECCEZIONI Le eccezioni possono venire segnalate: • dal sistema run-time, es.: ArithmeticException IndexOutOfBoundsException SecurityException NullPointerException ... • dal programma: throw e; Java (bucci/sassoli) 131 CHE COSA SONO LE ECCEZIONI • Le eccezioni sono oggetti, di una sottoclasse della classe Throwable: Object Throwable Exception Error unchecked exceptions Runtime Exception unchecked exceptions Java (bucci/sassoli) checked exceptions, definite dall’utente 132 Exception objects • Un’eccezione è un oggetto istanza di una qualche sottoclasse di java.lang.Throvable. • Throvable ha due sottoclassi standard: java.lang.Error e java.lang.Exception • Le eccezioni sono sottoclassi di Exception e rappresentano condizioni che possono essere rilevate e rimediate. Ad esempio java.io.EOFException segnala la fine di un file Java (bucci/sassoli) 133 Exception objects • • • • Poiché le eccezioni sono oggetti, esse possono contenere dati e metodi: Throvable ha un campo che è un messaggio (String), ereditato da tutte le classi eccezione. Questo campo viene usato per scriverci informazioni in forma leggibile L’informazione da scrivere nel campo viene passata al costruttore dell’oggetto eccezione Il messaggio può essere letto con il metodo Throvable.get.Message() Normalmente le eccezioni hanno questo solo campo. L’eccezione java.io.InterruptedIOxception ha il campo public int byte transferred, che specifica quanta parte del trasferimento ha avuto luogo prima dell’eccezione Java (bucci/sassoli) 134 .. Exception handling • finally: blocco usato di norma per le operazioni di pulizia (chiusura file, rilascio risorse, etc..) dopo un blocco try. Java garantisce che il finally è sicuramente eseguito se viene eseguito (anche parzialmente) il blocco try, indipendentemente da come si conclude. – Se il controllo lascia il try per effetto di break, continue o return il blocco finally è eseguito prima di passare alla nuova destinazione – Se il controllo lascia il try per un’eccezione e • c’è un catch: prima viene eseguito il catch e poi il finally. • non c’è il blocco catch: il controllo passa al finally e poi si propaga ai blocchi superiori verso il catch più prossimo che può trattare l’eccezione • Il finally può essere usato anche senza le eccezioni e il catch. In questo caso il finally è comunque eseguito (che si esca o no con break, continue o return) e assume il ruolo di pulizia al termine del blocco try Java (bucci/sassoli) 135 Dichiarazione delle eccezioni • Ogni metodo che può generare eccezioni deve o catturarle a suo interno o specificare il tipo di eccezioni che lo fanno terminare (che esso lancia): public void open_file() throws IOException{ /* istruzioni che possono generare una eccezione di IO non catturata entro open_file() */ } public void mioMetodo() throws MiaEccez1, MiaEccez2 { /* istruzioni che possono generare eccezioni di tipo MiaEccez1, MiaEccez2 non catturata entro mioMetodo()*/ } • E’ possibile segnalare una eccezione definita dal programmatore attraverso il comando throw seguito da un oggetto che un Throvable o sua sottoclasse if (t == null) throw new NullPointerException(“t è un puntatore nullo”) Java (bucci/sassoli) 136 Esempio //: ExceptionMethods.java public class ExceptionMethods { public static void main(String[] args) { try { throw new Exception("Ecco la mia eccezione"); } catch(Exception e) { System.out.println("Eccezione Catturata!"); System.out.println( "e.getMessage(): " + e.getMessage()); System.out.println( "e.toString(): " + e.toString()); System.out.println("e.printStackTrace():"); e.printStackTrace(); } } } Eccezione Catturata! e.getMessage(): Ecco la mia eccezione e.toString(): java.lang.Exception: Ecco è la mia eccezione e.printStackTrace(): java.lang.Exception: Ecco la mia eccezione at ExceptionMethods.main(ExceptionMethods.java:6) Java (bucci/sassoli) 137 Esempio throw class Tabella { int n; int [] a; …..… void inserisci(int x) { if (n >= a.length - 1) throw new RuntimeException("tabella piena"); ......... public static void main (String [] args) { Tabella t = new Tabella(2); t.inserisci(5); t.inserisci(8); ...... Runtime exception: tabella piena at Tabella.inserisci ... at Tabella.main ..... Java (bucci/sassoli) 138 Esempio try-catch //Catturare le eccezioni class Tabella { int n; int [] a; void inserisci(int x) { if (n >= a.length - 1) throw new RuntimeException("tabella piena"); ......... public static void main (String [] args) { Tabella t = new Tabella(2); try { t.inserisci(5); t.inserisci(8); } catch(RuntimeException e) { System.out.println(e. getMessage()); } Java (bucci/sassoli) 139 Guardiamo la documentazione cartella DOCS java.lang Class NullPointerException java.lang.Object | +--java.lang.Throwable | +--java.lang.Exception | +--java.lang.RuntimeException | +--java.lang.NullPointerException • • Thrown when an application attempts to use null in a case where an object is required. These include: • Calling the instance method of a null object. • Accessing or modifying the field of a null object. • Taking the length of null as if it were an array. • Accessing or modifying the slots of null as if it were an array. • Throwing null as if it were a Throwable value. Applications should throw instances of this class to indicate other illegal uses of the null object. Java (bucci/sassoli) 140 ... Guardiamo la documentazione Constructor Summary – NullPointerException() Constructs a NullPointerException with no detail message. – NullPointerException(String s) Constructs a NullPointerException with the specified detail message. • Methods inherited from class java.lang.Throwable • fillInStackTrace, getLocalizedMessage, getMessage, printStackTrace, printStackTrace, printStackTrace, toString • Bla, bla .. Java (bucci/sassoli) 141 MULTITHREADING CHE COS’E’ IL MULTITHREADING • Thread: flusso sequenziale di controllo (esecuzione di istruzioni) in un programma. • Nello stesso programma si possono far partire più thread che sono eseguiti concorrentemente. • Tutti i thread condividono le stesse variabili del programma, a differenza dai processi che hanno ciascuno il proprio contesto (lightweight process). • Nei computer a singola CPU la concorrenza viene simulata con una politica di scheduling che alterna l'esecuzione dei singoli thread. Java (bucci/sassoli) 143 CHE COS’E’ IL MULTITHREADING • Una applicazione Java che usa i thread può eseguire più attività contemporaneamente. Esempio: aggiornare l'informazione grafica sullo schermo e accedere alla rete. • Ad esempio, quando un main crea una finestra, viene attivato un thread di interfaccia utente, diverso da quello del main. • In alcuni casi i thread possono procedere in modo indipendente uno dall'altro (comportamento asincrono), in altri devono essere sincronizzati fra loro (es. produttore - consumatore). Java (bucci/sassoli) 144 MULTITASKING E MULTITHREADING Multitasking Multithreading OS OS OS OS Task Task 11 Task Task 22 Task Task 11 Task Task 33 Task Task 22 Monitor Monitor (interprete (interpreteJava) Java) Memoria condivisa Memoria condivisa Thread Thread 11 Memoria locale Thread Thread 22 Thread Thread 33 Memoria condivisa Memoria locale Memoria locale Java (bucci/sassoli) 145 RUN-TIME DATA AREA Thread 1 Thread 2 Thread n Program Counter Stack …. variabili locali, ecc. dei metodi Heap oggetti condivisi fra i thread, creati dinamicamente e garbage collected Method Area Java (bucci/sassoli) qui vengono caricati dal class loader i files .class, contenenti la descrizione della classe (campi, metodi, ecc.) 146 LA CLASSE Thread In Java, ogni thread è un oggetto: • ogni singolo thread viene creato come una istanza della classe java.lang.Thread • ogni istanza di java.lang.Thread deve essere associata a un metodo run() di qualche classe, che contiene il codice che deve essere eseguito dal thread • la classe java.lang.Thread contiene tutti i metodi per la gestione dei thread • … e in particolare il metodo start(), per “lanciare” il thread con il metodo run() “opportuno” Java (bucci/sassoli) 147 LA CLASSE Thread: SCHEMA “lancia” “lancia”ililthread, thread,rendendolo rendendoloschedulaschedulabile. Esegue il metodo run() del bile. Esegue il metodo run() delThread, Thread, che a sua volta lancia il metodo che a sua volta lancia il metodorun() run() dell’oggetto passato come parametro dell’oggetto passato come parametro alalcostruttore costruttoreThread(), Thread(),oppure oppure(se (se Thread non ha parametri) non fa nulla. Thread non ha parametri) non fa nulla. public class Thread implements Runnable Runnable target; …. public syncronized native void start() { … run(); } public void run() { if (target != null) { target.run(); } } Thread (Runnable t) { target = t; …. } } public interface Runnable { public abstract void run(); } Java (bucci/sassoli) 148 COME REALIZZARE UN THREAD Ci sono due metodi per realizzare un thread: Metodo 1: Metodo 2: run() implementando la interfaccia Runnable estendendo la classe java.lang.Thread Java (bucci/sassoli) e sovrascrivendo 149 METODO 1 public interface Runnable { public abstract void run(); } class Application implements Runnable { public void run() { <body> } } ... Application a = new Application(); /* creo l’Application a il cui metodo run() dovrà essere eseguita in un thread */ Thread th = new Thread(a); /* creo un thread e gli passo il riferimento all’Application a */ th.start(); /* lancio il thread, eseguendo il metodo a.run() */ Java (bucci/sassoli) 150 ESEMPIO 1.1 public class drinks { public static void main(String[] a) { Coffee c = new Coffee(); Tea t = new Tea(); Thread th1 = new Thread(c) ; th1.start(); Thread th2 = new Thread(t) ; th2.start() ; In questo esempio, un main crea } } e lancia i thread class Coffee implements Runnable { public void run() { while(true) { System.out.println(“I like coffee”);} } } class Tea implements Runnable { public void run() { while(true) { System.out.println(“I like tea”);} } } Java (bucci/sassoli) 151 ESEMPIO 1.2 public class drinks { public static void main(String[] a) { Coffee c = new Coffee(); Tea t = new Tea() ; } } class Coffee implements Runnable { In questo esempio, ogni Thread th; oggetto crea e lancia il proprio thread public void run() { while(true) { System.out.println(“I like coffee”);} } Coffee() { th = new Thread(this) ; th.start(); } } class Tea implements Runnable { Thread th; public void run() { while(true) { System.out.println(“I like tea”);} } Tea() { th = new Thread(this) ; th.start() ; } } Java (bucci/sassoli) 152 METODO 2 class Thread implements Runnable { public void start() { … run(); } public void run() { } } class MyThread extends Thread { // eredita start() public void run() { < body> } } sovrascrive MyThread p = new MyThread(); p.start(); Java (bucci/sassoli) 153 ESEMPIO 2.1 public class drinks { public static void main(String[] a) { Coffee th1=new Coffee(); th1.start(); In questo esempio, Tea th2=new Tea() ; th2.start(); un main crea } } e lancia i thread class Coffee extends Thread { public void run() { while(true) { System.out.println(“I like coffee”);} } } class Tea extends Thread { public void run() { while(true) { System.out.println(“I like tea”);} } } Java (bucci/sassoli) 154 ESEMPIO 2.2 public class drinks { public static void main(String[] a) { Coffee th1=new Coffee(); Tea=th2 new Tea() ; } } class Coffee extends Thread { public void run() { while(true) { System.out.println(“I like coffee”);} } Coffee() { start(); } } class Tea extends Thread { In questo esempio, public void run() { ogni thread si lancia while(true) { System.out.println(“I like tea”);} da solo } Tea() { start(); } } Java (bucci/sassoli) 155 QUANDO UN thread TERMINA? Un thread continua nella sua esecuzione, fino a quando: 1. run() ritorna 2. viene eseguito il metodo stop() del thread 3. una eccezione causa l’uscita da run() Java (bucci/sassoli) 156 SCHEDULING • lo scheduling è effettuato sulla base della priorità dei thread • la priorità può essere modificata mediante il metodo setPriority • a parità di priorità, lo scheduling è di tipo round-robin Java (bucci/sassoli) 157 ALCUNI METODI DI Thread public void start() public void run() public final void stop() public final void suspend() public final void resume() public static void sleep(long n) public final void setPriority(int newPriority) public final int getPriority() public static void yield() public final native boolean isAlive() ... Java (bucci/sassoli) lancia il thread esegue il codice distrugge il thread sospende il thread riattiva il thread sospende il thread per n msec modifica la priorità ottieni la priorità rischedula true se il thread è vivo 158 GLI STATI DI UN THREAD yield() new Thread() New New thread thread start() Alive suspend() sleep() wait() Runnable Runnable resume() notify() stop() stop() run() exit Not Not Runnable Runnable stop() Dead Dead Java (bucci/sassoli) 159 IL PROBLEMA DELLA MUTUA ESCLUSIONE i=0 thread 1 thread 2 class Count { int i = 0; void incr() { i+1 i = i + 1; } void decr() { i = i - 1; } 1 i -1 -1 i=1 i = -1 } Il valore finale di i dipende dalla sequenza di esecuzione Java (bucci/sassoli) 160 METODI synchronized Il modificatore synchronized prescrive che il metodo a cui si applica sia eseguito da un solo thread alla volta: - quando un thread esegue un metodo synchronized, viene fatto un lock dell’oggetto cui appartiene il metodo (o, per metodi static, della classe) - quando il thread termina l’esecuzione del metodo, viene fatta una unlock - prima di tale unlock, eventuali altri metodi synchronized si pongono in attesa Java (bucci/sassoli) 161 ESEMPIO i=0 thread 1 thread 2 class Count { int i = 0; synchronized void incr() { i = i + 1; i+1 1 i=1 } synchronized void decr() { i = i - 1; i -1 0 i=0 } } Il valore finale di i NON dipende dalla sequenza di esecuzione Java (bucci/sassoli) 162 BLOCCHI synchronized • La keyword synchronized può essere usata anche per proteggere blocchi arbitrari, e non solo metodi • in tal caso, occorre specificare l’oggetto di cui acquisire il lock Esempio: synchronized ( myObject ) { <blocco> } Java (bucci/sassoli) 163 ESEMPIO synchronized void MyMethod() { … } è equivalente a: void MyMethod() { synchronized (this) { … } } Java (bucci/sassoli) 164 ESEMPIO import java.util.Vector; public class MsgQueue { Vector queue = new Vector(); public synchronized void send(Object obj) { queue.addElement(obj); } public synchronized Object receive() { if (queue.size() == 0) return null; Object obj = queue.firstElement(); queue.removeElementAt(0); return obj; } } Java (bucci/sassoli) 165 wait, notify Sono metodi della classe Object: public final void wait(); public final void wait(long millis); public final void notify(); Java (bucci/sassoli) /* rilascia il lock e si pone in wait */ /* wait con timeout */ /* rilascia il lock */ 166 ESEMPIO Schema Produttore-Consumatore // Thread produttore: produce un dato while (buffer_full) wait() produce_data() notify() // Thread consumatore: consuma un dato while (no_data) wait() consume_the_data() notify() Java (bucci/sassoli) 167 JAVA E INTERNET Java (bucci/sassoli) 168 APPLET JAVA • Sono programmi Java riferiti da link in pagine HTML • Vengono caricati e interpretati dal browser (se questo supporta Java) • Permettono di “animare” le pagine web Java (bucci/sassoli) 169 HTML con APPLET: ESEMPIO <HTML> <HEAD> <TITLE> Esempio </TITLE> </HEAD> <BODY> <P> Testo <APPLET CODE=“HelloWorld.class WIDTH=300 HEIGHT=80> Qui c’è un applet che ti saluta </APPLET> testo che esce se il browser </BODY> non supporta gli applet </HTML> Java (bucci/sassoli) Hallo! 170 Applet • Dove si trova la classe Applet nella gerarchia di java java.applet Class Applet java.lang.Object | +--java.awt.Component | +--java.awt.Container | +--java.awt.Panel | +--java.applet.Applet Java (bucci/sassoli) 171 Alcuni metodi di Applet Method Operation void init( ) called when the applet is first created to perform first-time initialization of the applet (Il browser non passa alcun argomento a costruttore dell’applet, per cui non ha molto senso definire un costruttore diverso) voit start( ) Called every time the applet moves into sight on the Web browser to allow the applet to start up its normal operations (especially those that are shut off by stop( )). Also called after init( ). void paint( ) Part of the base class Component (three levels of inheritance up). Called as part of an update( ) to perform special painting on the canvas of an applet. void stop( ) Called every time the applet moves out of sight on the Web browser to allow the applet to shut off expensive operations. Also called right before destroy( ). void destroy( ) Called when the applet is being unloaded from the page to perform final release of resources when the applet is no longer used string getAppletInfo Returns information about this applet URL getParameter() Returns the base URL (l’URL da cui è stata scaricata) Java (bucci/sassoli) 172 Cosa serve in un Applet • • • • • • Importare il package Applet e costruire una classe che estende Applet Implementare almeno un metodo tra i seguenti init, start, paint I/O attraverso classi grafiche – per esempio g.drawString("=======") Costruire un file HTML che richiama l'Applet Usare un browser o appletviewer Esempio import java.applet.Applet; import java.awt.Graphics; public class HelloW extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 50, 25); } } • Il browser chiama sempre init() Java (bucci/sassoli) 173 Esecuzione dell’Applet • File html: <comment> File:HelloW.html </comment> <HTML> <BODY> <APPLET CODE=HelloW.class WIDTH=150 HEIGHT=50> </APPLET> </BODY> </HTML> • Per eseguire: – Cliccare su HelloW.html – >appletviewr HelloW.html Java (bucci/sassoli) 174 SimpleApplet • • • • Si inizializza Parte Si ferma Pulisce prima di uscire. • Vale la pena di farlo girare con appletviewer e osservare i messaggi che esso presenta su System.out, in relazione a quanto accade all’applet. Java (bucci/sassoli) 175 Simple Applet import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; public class SimpleApplet extends Applet{ int i=0; String text; public void init() { text = "Sono un semplice Applet: "; setBackground(Color.cyan); } public void start() { System.out.println("starting..."); } public void stop() { System.out.println("stopping..."); } public void destroy() { System.out.println("preparing to unload..."); } public void paint(Graphics g){ g.setColor(Color.blue); g.drawRect(0, 0, 200, 100); g.setColor(Color.red); g.drawString(text, 30, 30); g.setColor(Color.yellow); g.drawString("Metodo Paint: " + i, 100, 60); System.out.println("SPaint:" + i); i++; } } Java (bucci/sassoli) 176 SimpleApplet Java (bucci/sassoli) 177 HelloWColorato // Adattato da Java Examples in a Nutshell_. (http://www.oreilly.com) import java.applet.*; import java.awt.*; public class HelloWColorato extends Applet { static final String message = "Hello World"; private Font font; public void init() {// One-time initialization for the applet. font = new Font("Helvetica", Font.BOLD, 48); } public void paint(Graphics g) { g.setColor(Color.pink); g.fillOval(10, 10, 330, 100); // The pink oval g.setColor(Color.red); // The red outline. Java doesn't support g.drawOval(10,10, 330, 100); // wide lines, so we simulate g.drawOval(9, 9, 332, 102); // a 4-pixel wide line by drawing g.drawOval(8, 8, 334, 104); g.drawOval(7, 7, 336, 106); g.setColor(Color.black); g.setFont(font); g.drawString(message, 40, 75); } } Java (bucci/sassoli) 178 Sicurezza e Applet • Gli applet scaricati da rete sono considerati untrusted Per questo motivo i Browser del Web e viewer mettono limitazioni quello che un applet può fare. Un Applet scaricato da rete non può: – Leggere, scrivere, modificare, cancellare, ridenominare i file – listare il contenuto delle cartelle – verificare se esiste un file – ottenere la data o la dimensione di un file – ..e altro Java (bucci/sassoli) 179 ... Sicurezza e Applet • • Security Manager E’ ottenuto attraverso la classe java.lang.SecurityManager la quale definisce metodi per verificare se certe operazioni sono consentite un dato ambiente – Il browser lo subclassa ed aggiunge eventuali controlli e lo istanzia come oggetto – Il manager viene registrato con System.setSecurityManager() – Il manager viene interrogato prima di fare cose rischiose Class Loader Ottenuto subclassando java.lang.ClassLoader definendo come i file .class vengono caricati attraverso i vari protocolli. – Le classi locali hanno un name space separato da quelle scaricate, in modo da ottenere un trattamento diverso rispetto a quelle scaricate da rete Java (bucci/sassoli) 180 ... Sicurezza e Applet • ByteCode verification E’ sempre compito del class loader: – Codici validi per la JVM – Non esce dallo stack – Non sporca i registri – Non fa conversioni illegali • Classi firmate: è possibile appendere una firma digitale alle classi (ai file JAR). Il browser può consentire lo svolgimento di azioni normalmente negate se il file JAR è firmato (la decisione di chi accettare è specificata dall’utente). Il JDK fornisce i servizi per la firma Java (bucci/sassoli) 181