“Java non ha i puntatori” Ma è vero? Point punto = new Point(10,10); l’identificatore di un oggetto (“punto”) sembra proprio un puntatore! Quel che Java non ha è l’aritmetica dei puntatori . Confronto dell’operatore new in C++: in Java: Point * punto = new Point(10,10); Point punto.x di Java punto = new Point(10,10); equivale a punto->x del C++ In Java gli oggetti sono accessibili SOLO per referenza . memory management La gestione (dinamica) della memoria e’ automatica, tramite la creazione (operatore new ) e la distruzione (garbage collection) di oggetti. GC interviene quando serve memoria. GC elimina gli oggetti per i quali non vi sono piu’ riferimenti attivi. GC puo’ essere attivato su richiesta esplicita: System.gc() memory management - costruttori Operazioni da eseguirsi alla nascita di un oggetto vanno definite nel metodo “costruttore”. Ogni classe deve avere uno (o più) costruttori. I costruttori possono differire per numero e tipo di parametri. Es.: Pila() { size=100; … } Pila(int size) { this.size=size } memory management - distruttori Operazioni da associarsi con l’eliminazione di un oggetto possono essere definite nel metodo “distruttore” finalize() (opzionale) NOTA: il metodo finalize POTREBBE NON ESSERE CHIAMATO DAL SISTEMA (es. se il programma finisce prima…) Per essere certi che vengano chiamati i metodi finalize, occorre chiamare la System.runFinalization() subito DOPO la System.gc() System agisce come libreria System.out.println(…); System.gc(); System.runFinalization(); System.exit(int status); System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length); long System. currentTimeMillis(); Class String Class String Class String Class String Class String String Per trasformare il contenuto di una stringa in un intero: int Integer.parseInt(String s) Per trasformare il contenuto di una stringa in un float: float Float.parseFloat(String s) I parametri del main sono inclusi in un vettore di String Parametri di ingresso /* sum and average command lines */ class SumAverage { public static void main (String args[]) { int sum = 0; float avg = 0; for (int i = 0; i < args.length; i++) { sum += Integer.parseInt(args[i]); } System.out.println("Sum is: " + sum); System.out.println("Average is: " + (float)sum / args.length); } } prompt> java SumAverage 7 9 12 Arrays E’ possibile definire arrays di tutti i tipi di dati (elementari o classi). In fase di DEFINIZIONE non e’ necessario specificare la dimensione del vettore. Solo al momento della ALLOCAZIONE viene richiesto lo spazio desiderato. String[ ] strings; // this variable can refer to any String array strings = new String[10]; // one that contains 10 Strings strings = new String[20]; // or one that contains 20. int f[ ][ ] = new int[5][3]; //array bidimensionale char s[]={'+','-','*','/','=','C'}; // array inizializzato in creazione Convenzioni I nomi delle Classi iniziano con la MAIUSCOLA I nomi degli Oggetti iniziano con la MINUSCOLA Pila p=new Pila(); Passaggio di parametri Le variabili dei tipi di dati primitivi sono sempre passati per copia. Gli oggetti sono sempre passati per referenza. (a pensarci, é ovvio: si copia l’identificatore dell’oggetto) Passaggio di parametri public class Numero { public int valore=0; Numero(int valore) { this.valore=valore; } } Passaggio di parametri public class Parametri { void incrementa(int x) {x++;} void incrementa(Numero x) { x.valore++;} public static void main(String a[]){ Parametri p=new Parametri(); } Parametri() { int z=5; incrementa(z); System.out.println(z); Numero n=new Numero(z); incrementa(n); System.out.println(n.valore); } } public class Numero { public int valore=0; Numero(int valore) { this.valore=valore; } } Output: 5 6 19 Esercizio: Costruite una Coda analoga alla Pila