Concetti Fondamentali Usare e costruire oggetti Gli oggetti sono entità di un programma che si possono manipolare invocando i metodi • System.out oggetto della classe PrintStream • println(String s) metodo della classe PrintStream • System.out.println(“Hello, World!”); invocazione del metodo println sulloggetto System.out passando come parametro loggetto String “Hello, World!” Inte rfa ccia pubblica di una cla s s e Le AP I di J a va Lo s pa zio di me moria de lla ma cchina a s tra tta J a va Blocchi e s ottoblocchi Va ria bili di fra me e loro vis ibilità Importa zioni di cla s s i Cos truttori La bora torio di P rogra mma zione - Luca Te s e i 1 La bora torio di P rogra mma zione - Luca Te s e i Interfaccia Pubblica di una classe Application Program Interface Specifica cosa si può fare con gli oggetti che si creano da essa Contiene tutti i campi e i metodi public definiti allinterno della classe Rappresenta il contratto della classe: cosa si impegna a fare È la candidata naturale a documentazione della classe Le classi standard fornite con la SDK hanno la documentazione sullinterfaccia pubblica La bora torio di P rogra mma zione - Luca Te s e i 2 3 A.P.I. E la documentazione riguardande le interfacce pubbliche di tutte le classi (e altro) fornite con la SDK Online sul sito della sun (link alle API delle varie distribuzioni): http://java.sun.com/reference/api/index.html Scaricabile anche come .zip per averlo in locale sempre dal sito http://java.sun.com nella pagina di download della JDK La bora torio di P rogra mma zione - Luca Te s e i 4 Esempio: la classe String Esercizio Linterfaccia pubblica della classe String specifica lesistenza di un metodo di nome length int length() Returns the length of this string Restituisce un numero intero (int) che rappresenta la lunghezza • System.out.println(“Hello, World!”.length()); Stampa 13, il numero di caratteri nella stringa La bora torio di P rogra mma zione - Luca Te s e i 5 La bora torio di P rogra mma zione - Luca Te s e i Creazione di Oggetti 6 Loggetto creato • System.out è già creato automaticamente dalla JVM • “Hello, World!” come oggetto della classe String viene creato intrinsecamente visto che è inserito nel testo del programma Ma il modo principale per creare oggetti è quello di usare loperatore new new Rectangle(5,10,20,30) Crea un oggetto della classe Rectangle La bora torio di P rogra mma zione - Luca Te s e i Trovare la documentazione della classe PrintStream Trovare la documentazione della classe String Estendere Hello.java stampando Hello un carattere per volta su righe successive Stampare poi la lunghezza di Hello e stampare sulla stessa riga tutti i caratteri della stringa intervallati da due spazi: H e l l o 7 Rectangle è una classe inclusa nella SDK. Nelle API: Rectangle(int x, int y, int width, int height) Cons tructs a ne w Re cta ngle whos e top-le ft corne r is s pe cifie d a s (x, y) a nd whos e width a nd he ight a re s pe cifie d by the a rgume nts of the s a me na me . La bora torio di P rogra mma zione - Luca Te s e i 8 Costruzione (0,0) Il processo di creazione di un nuovo oggetto: Dopo la parola chiave new va inserito specificato il costruttore per loggetto I costruttori sono metodi speciali che Rectangle: il concetto 5 x 10 Hanno come nome lo stesso nome della classe (in questo caso Rectangle) Hanno diversi parametri di costruzione 20 Fine s tra Gra fica 30 Nel nostro caso abbiamo usato il costruttore, indicato nelle API, che prende 4 interi y La bora torio di P rogra mma zione - Luca Te s e i 9 La bora torio di P rogra mma zione - Luca Te s e i Lo spazio di memoria del linguaggio Java Rectangle: loggetto He a p Rectangle x 5 y 10 width 20 height 30 La bora torio di P rogra mma zione - Luca Te s e i 10 Vediamo la gestione della componente memoria nella macchina astratta del linguaggio Java La memoria è idealmente divisa in due sezioni: 1. Lo heap (mucchio) che contiene gli oggetti 2. Lo stack di attivazioni che contiene le variabili del programma 11 La bora torio di P rogra mma zione - Luca Te s e i 12 Lo Heap Lo Heap: rappresentazione rif#2 È uno spazio di memoria gestito automaticamente dalla macchina astratta Contiene gli oggetti creati dal programma Ogni oggetto residente ha un indirizzo, o riferimento, che lo identifica univocamente e lo rende raggiungibile dal programma Gli oggetti non più riferiti da nessuna variabile vengono cancellati: lo spazio che occupano viene dichiarato libero ed è riutilizzabile La bora torio di P rogra mma zione - Luca Te s e i Rectangle rif#1 5 10 20 30 Rectangle x y width height 13 25 10 40 30 La bora torio di P rogra mma zione - Luca Te s e i 14 Lo stack di attivazioni Le variabili dichiarate nei metodi sono conservate in una zona apposita di memoria Questa zona è strutturata come una pila (stack) di attivazioni Unattivazione consiste di un particolare contesto di esecuzione (in Java è sempre l'esecuzione di un qualche metodo) Il metodo main lanciato con java è lattivazione principale e si trova sempre in fondo alla pila La bora torio di P rogra mma zione - Luca Te s e i y width height Lo stack di attivazioni x 15 Ogni chiamata di metodo crea una nuova attivazione Allinterno di un metodo posso chiamare altri metodi e quindi le attivazioni si impilano una sopra laltra Il modo di funzionare della pila fa in modo che ogni attivazione stia immediatamente sopra a quella che l'ha creata chiamando un certo metodo Togliendo dalla testa si ritrova il chiamante La bora torio di P rogra mma zione - Luca Te s e i 16 Allinterno di una attivazione Sottoblocchi Lo spazio di memoria allinterno di una certa attivazione è anchesso strutturato come una pila Gli elementi della pila sono chiamati frame Ogni frame contiene delle associazioni fra nomi di variabili e valori delle stesse Ogni frame rappresenta un blocco di esecuzione Un blocco è tutto il codice tra due { ... } La bora torio di P rogra mma zione - Luca Te s e i 17 Visibilità Il frame più in basso nella pila allinterno di una attivazione corrisponde al blocco principale dellattivazione (il blocco del metodo) Allentrata di un sottoblocco viene creato ed impilato un altro frame Sottoblocchi di sottoblocchi di sottoblocchi..... => pila di frame I sottoblocchi gestiscono la visibilità (lo scope) delle variabili (chiariremo meglio in seguito) La bora torio di P rogra mma zione - Luca Te s e i 18 Stack delle attivazioni In ogni momento lattivazione che si trova in testa alla pila è quella in esecuzione Non cè nessun rapporto né visibilità tra le variabili dello stack di frame di una attivazione con quelle di una qualsiasi altra attivazione (sia sopra che sotto nella pila) Allinterno di ogni attivazione lo stack di frame gestisce la creazione e la cancellazione delle variabili di frame (dette anche variabili automatiche) La bora torio di P rogra mma zione - Luca Te s e i 19 Attiva zione in e s e cuzione fra me a ttua le x 3 y z 7 rif#n o1 rif#k i j 3 0 La bora torio di P rogra mma zione - Luca Te s e i fra me S ta ck de i fra me fra me de l blocco principa le 20 Variabili Dichiarazione di variabili Le variabili che si trovano allinterno dei frame possono essere di due tipi: 1. Tipo base del linguaggio: int, double, char,... 2. Tipo riferimento o Tipo oggetto Le variabili del tipo 1 contengono i valori caratteristici del tipo (esempio int interi) Le variabili del tipo 2 contengono riferimenti ad oggetti che si trovano nello heap La bora torio di P rogra mma zione - Luca Te s e i 21 Tipo nomeVariabile; Tipo nomeVariabile = valore_iniziale; La variabile viene creata nel frame che si trova in testa alla pila dellattivazione corrente (quella in testa alla pila di attivazioni) La variabile ha come scope (contesto) il blocco in cui è dichiarata: al di fuori non esiste I parametri di un metodo, alla chiamata, sono visti come variabili che vengono create nel frame del blocco principale ed inizializzate con i valori passati La bora torio di P rogra mma zione - Luca Te s e i Variabili int x = 13; int y; Rectangle box; x y box Variabili Va lore di de fa ult pe r va ria bili di tipo ba s e non inizia lizza te 13 w null ........ Va lore di de fa ult pe r va ria bili rife rime nto non inizia lizza te Le variabili di tipo base non inizializzate (valore w) non possono essere usate fino a quando non viene assegnato loro un valore Loperatore = è lassegnamento: Fra me corre nte Attiva zione corre nte La bora torio di P rogra mma zione - Luca Te s e i 22 23 x = E; Valuta lespressione E Controlla se il valore v ottenuto è compatibile con il tipo della variabile x Se sì, copia v nella variabile x cancellando quello che conteneva precedentemente La bora torio di P rogra mma zione - Luca Te s e i 24 Variabili riferimento Variabili riferimento Come tipo hanno il nome di una certa classe Possono contenere un riferimento ad un oggetto di quella classe (o compatibile, chiariremo in seguito) che risiede nello heap Non contengono loggetto, ma il riferimento Il valore lo rappresentiamo o con rif#n o con una freccia che punta alloggetto nello heap La bora torio di P rogra mma zione - Luca Te s e i box = new Rectangle(5,10,20,30); y = -10 + 2; S ta ck Attiva zioni x x y box ........ y width height La bora torio di P rogra mma zione - Luca Te s e i 5 10 20 30 La bora torio di P rogra mma zione - Luca Te s e i width height 5 10 20 30 26 import java.awt.Rectangle; public class MoveTest { public static void main(String[] args) { Rectangle box = new Rectangle(5,10,20,30); // sposta il rettangolo di un vettore box.translate(15,25); // stampa il rettangolo spostato System.out.println(box); } } Rectangle x x Codice: MoveTest.java He a p 13 -8 Rectangle y ........ 25 Rectangle box1 = box; box1 13 -8 y box Variabili riferimento S ta ck Attiva zioni He a p 27 Stampa: java.awt.Rectangle[x=20,y=35,width=20,height=30] La bora torio di P rogra mma zione - Luca Te s e i 28 Importazione di classi Importazioni di classi Le classi fornite con la SDK sono raggruppate in pacchetti (packages) Ogni pacchetto contiene classi affini • java.awt è un pacchetto che contiene classi utili per disegnare finestre e forme grafiche (awt = Abstract Windowing Toolkit) • import importa una certa classe come in import java.awt.Rectangle; Oppure un intero pacchetto: import java.awt.*; La bora torio di P rogra mma zione - Luca Te s e i 29 La classe PrintStream ha un metodo println per stampare anche oggetti: Stampa: java.awt.Rectangle[x=5,y=10,width=20,height=30] La stampa è una descrizione testuale dei valori dei campi delloggetto in questione In questo esempio loggetto viene creato, stampato e poi, non avendo salvato il suo riferimento, cancellato La bora torio di P rogra mma zione - Luca Te s e i Es: String fa parte di java.lang 30 Tanti costruttori System.out.println(new Rectangle(5,10,20,30)); La importiamo (o importiamo tutto il pacchetto che la contiente) Fa parte del pacchetto java.lang o java.io che viene importato automaticamente La bora torio di P rogra mma zione - Luca Te s e i Stampare un oggetto Qualunque classe che non abbiamo definito, come classe pubblica, nella stessa cartella in cui si trova il file sorgente che stiamo scrivendo risulterà sconosciuta al compilatore A meno che: 31 La stessa classe può avere più costruttori, a seconda di quanti modi ci possono essere per inizializzare i valori dei campi Ogni costruttore si diversifica in base ai tipi e alla quantità dei suoi parametri Per ogni classe esiste un costruttore di default che non prende nessun parametro ed assegna alle variabili istanza delloggetto valori di default La bora torio di P rogra mma zione - Luca Te s e i 32 Costruttore di default Valori di default Rectangle boxdef = new Rectangle(); Rectangle boxde f ....... x 0 y width 0 height ....... 0 0 ....... La bora torio di P rogra mma zione - Luca Te s e i 33 Per variabili numeriche (int, float, double, byte): 0 o 0.0 Per caratteri (char): carattere nullo a valore numerico -1 Per variabili riferimento: null Questi valori di default valgono solo per le variabili istanza di un oggetto, non per le variabili dei frame Se le variabili di frame non sono inizializzate il compilatore genera sempre errore se vengono usate prima di essere assegnate (per convenzione, valgono w, i tipi base, e null le variabili riferimento) La bora torio di P rogra mma zione - Luca Te s e i Esercizi Esercizi Scrivere una classe con un metodo main in cui: Si crea una variabile di frame s che punta a una stringa Ciao Ciao e una variabile di frame s1 che punta a una stringa ciao ciao Si studi la documentazione della classe java.lang.StringBuffer Si scriva un programma in cui Si stampa il risultato del metodo equals della classe String chiamato sulla stringa s passando s1 come parametro si creano tre oggetti diversi della classe Rectangle si crea un nuovo oggetto della classe StringBuffer inizialmente contentente la stringa Rettangoli: \n continua... Si stampa il risultato del metodo compareToIgnoreCase chiamato come sopra La bora torio di P rogra mma zione - Luca Te s e i 34 35 La bora torio di P rogra mma zione - Luca Te s e i 36 Esercizi Esercizi si usa il metodo append di StringBuffer per aggiungere allo string buffer che abbiamo creato la descrizione ottenuta dal primo rettangolo chiamando su di esso il metodo toString() si aggiunge allo string buffer un a capo si aggiungono le descrizioni degli altri due rettangoli separandole con a capo Consultare il codice allegato nella cartella rectangles che permette di creare una finestra grafica e di visualizzare gli oggetti Rectangle che si creano Consultare le API delle varie classi del pacchetto java.awt che vengono usate nel codice Provare a modificare il codice disegnando altre figure geometriche si stampa sullo schermo la stringa ottenuta La bora torio di P rogra mma zione - Luca Te s e i 37 La bora torio di P rogra mma zione - Luca Te s e i Esercizi 38 Esercizi Consultare il codice allegato nella cartella applet Consultare le altre cartelle del codice allegato e provare a capire come funziona Per eseguire l'Applet aprire il file .html con un browser che ha un plugin per Java Modificare e personalizzare la faccia di alieno Provare a modificare il codice in modo da visualizzare altre figure geometriche La bora torio di P rogra mma zione - Luca Te s e i 39 La bora torio di P rogra mma zione - Luca Te s e i 40