2 – Esecuzione di un programma Java Marco Tessarotto Programmazione dei Calcolatori Anno Accademico 2004-2005 Eseguire un programma Java Scriviamo un programma… vedi esempio precedente Lo salviamo in un file sul disco del calcolatore Editor: potete usare JEditor, notepad… Il nome del file sarà Hello.java; regola di Java: se X è il nome della classe, allora il file si chiama X.java Eseguire un programma Java/2 Ok, abbiamo il file contente il codice sorgente Il calcolatore non può eseguire direttamente il codice Java… i processori eseguono linguaggi macchina È necessario un collegamento tra Java e linguaggio macchina Compilatori ed interpreti Compilatore: sw che traduce un sorgente scritto in linguaggio di alto livello (es. Java, C, C++…) in linguaggio macchina Interprete: programma che utilizza il sorgente scritto in linguaggio di alto livello e ne esegue direttamente le istruzioni Eseguire un programma Java/3 Per un eseguire un programma Java, occorre utilizzare un compilatore ed un interprete… In Java, il codice sorgente viene tradotto (compilato) in un linguaggio macchina “idealizzato”: Byte Code Java Byte Code Java non è eseguibile direttamente dai processori tradizionali Eseguire un programma Java/4 Partiamo dal file sorgente X.java Invochiamo il compilatore Java (javac)… Viene creato un file X.class, contenente la traduzione in Byte Code Java del nostro programma [è un file “binario”] Eseguire un programma Java/5 Adesso possiamo far eseguire il codice Byte Code Java dall’interprete Java (java) L’interprete Java interpreta (esegue) le istruzioni contenute in X.class N.B.: una volta compilato il programma (è stato generato il file X.class), questo può essere interpretato (eseguito) tutte le volte che si vuole Scrittura del sorgente Compilazione in Byte Code Java (X. java) (X. class) Esecuzione del programma tramite interprete Byte Code Java Vantaggi? Il Byte Code Java non è vincolato ad un microprocessore e/o alla sua architettura e/o sistema operativo È necessario che sia implementato l’interprete Java per la piattaforma che si vuole utilizzare Byte Code Java/2 Sono stati scritti interpreti Java per una varietà di calcolatori…ma non solo Cellulari, palmari, set-top box, sistemi “embedded”… L’interprete Java può essere incapsulato all’interno di altri programmi (es. web browser) consentendo l’esecuzione di applicazioni Java all’interno di pag. html Piattaforme Java Java Enterprise Edition (J2EE) Java Standard Edition (J2SE) Java Micro Edition (J2ME) Java Smart Card Java TV N.B.: l’interprete Java viene detto “macchina virtuale Java” (JVM) Java su Windows Per scrivere, compilare ed eseguire programmi Java su Windows: Installare “Java Software Development Kit (SDK)” Da prompt ms-dos, invocare javac e java Ovviamente esistono programmi più evoluti per scrivere applicazioni Java… Riferimenti a oggetti Realizziamo un programma (composto da un solo oggetto) Scriviamo un file sorgente, contentente la classe (che descrive l’oggetto) Per utilizzare un oggetto, istanziamo la classe corrispodente Riferimenti a oggetti/2 AlgoritmoXYZ.java class AlgoritmoXYZ { ... // descrizione dell’algoritmo } File sorgente codice sorgente Per utilizzare AlgoritmoXYZ, è necessario istanziare la classe, ovvero creare un oggetto di tipo AlgoritmoXYZ Ottengo un riferimento ad un oggetto di tipo AlgoritmoXYZ Riferimenti a oggetti/3 Un programma opera sugli oggetti attraverso identificatori (riferimenti) Un oggetto è una istanza di un classe; opero sull’oggetto attraverso il suo riferimento (identificatore) In Java, per prima cosa si dichiarano i riferimenti ad oggetti; ma prima di usarli, occorre crearli (“attivando” i riferimenti) Riferimenti a oggetti/4 dichiariamo il riferimento ad un oggetto di tipo AlgoritmoXYZ AlgoritmoXYZ alg; alg è il riferimento all’oggetto (da creare) Creiamo l’oggetto… alg = new AlgoritmoXYZ( ); Adesso l’oggetto esiste e possiamo usarlo Riferimenti a oggetti/5 alg è un riferimento ad un oggetto di tipo AlgoritmoXYZ alg viene detto variabile di riferimento Una volta creato, posso mandare messaggi all’oggetto (invocare metodi) attraverso il suo riferimento RIFERIMENTO OGGETTO alg AlgoritmoXYZ Riferimenti a oggetti/6 Posso avere più riferimenti ad uno stesso oggetto: AlgoritmoXYZ alg = new AlgoritmoXYZ(); AlgoritmoXYZ alg2; alg2 = alg; alg alg2 OGGETTO AlgoritmoXYZ String Fare riferimento ad un oggetto non creato dà origine ad un errore di run time String è una classe predefinita di Java: modella una sequenza di caratteri (lettere, cifre, segni di interpunzione, spazi e simboli speciali) In java, ogni gruppo di caratteri tra virgolette è un riferimento ad un oggetto String che modella quella sequenza di caratteri Es.: “Hello world!” String/2 “Hello” riferimento si riferisce a Istanza di classe String oggetto La classe String prevede vari metodi “Hello”.toUpperCase() : mandiamo un “messaggio” all’oggetto cui “Hello” si riferisce La classe String non consente di modificare la stringa di caratteri che l’oggetto modella… String/3 “Hello” riferimento Istanza di String oggetto riferimento toUpperCase() messaggio Oggetto String che modella “Hello” “Hello”.toUpperCase() riferimento Oggetto String che modella “HELLO” String/4 La classe String è progettata in modo che operazioni su un oggetto String restituiscono un nuovo oggetto String L’oggetto originario rimane immutato Il metodo toUpperCase() restituisce un riferimento ad un nuovo oggetto String/5 La classe String prevede svariati metodi Consultare la documentazione Java (API Specification) String/6 Altri metodi importanti di String: int length() String substring(int beginIndex) String concat(String s) int indexOf(String str) Indice 0 delle stringhe (come in C) Variabili di riferimento Una variabile è un identificatore cui si può attribuire un valore si dice variabile perché può contenere diversi valori in momenti diversi (il suo valore può variare) Variabile di riferimento: variabile il cui valore è un riferimento Variabili di riferimento/2 Per introdurre una variabile di riferimento in un programma Java si scrive una dichiarazione di variabile di riferimento: AlgoritmoXYZ alg; String str; Si scrive la classe dell’oggetto seguita dall’identificatore della variabile Assegnazione Per attribuire un valore ad una variabile, si usa l’istruzione di assegnazione: str = “Hello”; Questa istruzione assegna a str il riferimento “Hello”; sia str che “Hello” si riferiscono allo stesso oggetto “Hello” riferimento str Istanza di String oggetto Metodi Applicare un metodo (inviare un messaggio) ad un oggetto String str = “Hello”; str = str.toUpperCase(); Str riferimento Istanza di String oggetto toUpperCase() messaggio Metodi/2 Il metodo toUpperCase( ), come fa a sapere su quale oggetto lavorare? Nell’invocazione del metodo, viene passato str come parametro aggiuntivo nascosto String str = “Hello”; str = str.toUpperCase(); Confronto tra stringhe String a = “1234”; String b = “1234”; “le due stringhe sono uguali?” a riferimento b riferimento Istanza di String “1234” oggetto Istanza di String “1234” oggetto Confronto tra stringhe/2 Vi sono due oggetti di tipo String che modellano la stessa stringa: “1234” La domanda giusta è: le stringhe modellate dai due oggetti sono uguali? If ( a.equals(b) ) { … Oppure: if ( b.equals(a) ) … In C si usa strcmp(char * a, char * b) Confronto tra stringhe/3 public boolean equals(Object arg) a riferimento Istanza di String “1234” oggetto equals( b ) messaggio Istanza di String b riferimento “1234” Convenzioni di scrittura Nomi di classe: Molte parole, tutte con iniziale maiuscola ThisIsAClassWithLongName Nomi di ogni altra cosa (metodi, variabili …) Molte parole, tutte capitalized eccetto la prima thisIsAnObject thisIsAMethod