oggetti e tipi primitivi hanno una diversa rappresentazione in memoria:
tipi primitivi
oggetti
memoria allocata automaticamente a tempo di compilazione
memoria allocata durante l’esecuzione del programma (operatore new)
i riferimenti sono la versione di Java dei puntatori di C.
sono indirizzi di memoria, il cui valore numerico è però sconosciuto.
gli oggetti quindi sono memorizzati nelle variabili attraverso il loro riferimento (e non direttamente)
esistono due (tre) tipi di memoria:
heap - memoria per la creazione dinamica (oggetti)
stack - variabili locali
esempio
rappresentare la memoria
esempio di codice da analizzare
public class Tornello{ static private int passaggi;}
che fare?
analizzare i campi statici
(qui, nel metaspace inserisco “passaggi = 0”, perché Java inizializza gli interi automaticamente a 0)
analizzare il main
si fa una barra nello stack per dare uno spazio al metodo main
si crea il vettore args che contiene Stringhe (che deve puntare dal main allo heap perché le Stringhe e gli Array sono oggetti)
anche il Tornello t1 deve puntare allo heap, perché i Tornelli sono oggetti (Tornello non ha campi che non siano statici - se li avesse avuti, avremmo dovuto mettere le variabili nel rettangolo nello heap)
analizzare le chiamate ai metodi:
si crea lo spazio per ogni chiamata nello stack (e si modificano eventuali campi che queste chiamate modificano)
ogni chiamata si sovrappone a quella precedente - se chiamo passa() e poi Tornello(), sullo stack si vede solo Tornello(), che prende il posto di passa(), e crea un nuovo Tornello t2
indici dei loop
visualizzazione
rappresentazione finale tornello
i campi static
I campi di una classe possono essere dichiarati static.
Un campo static è relativo all’intera classe, non al singolo oggetto istanziato - esiste in una singola locazione di memoria, allocata in una zona speciale chiamata MetaSpace.
per ogni campo non static c’è invece una locazione di memoria per ogni oggetto (collocata dopo new)