vuoi
o PayPal
tutte le volte che vuoi
1. Gestione della Memoria Stack:
lo stack o pila è una parte della memoria utilizzata per contenere i dati dei singoli metodi.
1.1 Al momento della chiamata di un metodo sullo stack viene memorizzato il punto di rientro dal
metodo nel record di attivazione del metodo chiamante (quello sottostante);
1.2 viene creato un nuovo record di attivazione;
1.3 al quale vengono passati i parametri;
1.4 al termine del metodo vengono memorizzati i risultati nel record di attivazione inferiore;
1.5 viene distrutto il record di attivazione del metodo appena terminato;
1.6 si prosegue l’esecuzione dal punto di rientro.
Al momento della chiamata di un metodo sullo stack, viene creata la nuova cella per il nuovo
metodo (rec2) e nel rec1 si memorizza il punto di rientro (program counter). Avviene un passaggio
di parametri dal rec1 al rec2 e il rec2 comincia ad eseguire le operazioni richieste, al termine delle
quali ripasserà i valori al record sottostante (rec1) e verrà distrutto il rec2. Infine, si prosegue dal
punto di rientro memorizzato.
Può capitare che per metodi ricorsivi, un metodo richiami se stesso e quindi eseguirà i punti 1-2-3
fino a risolvere le operazioni richieste, per poi eseguire i punti 4-5-6 lo stesso numero di volte.
2. Regole di promozione implicita ed esplicita:
è possibile avere una promozione solo tra superclassi e sottoclassi o supertipi e sottotipi (i due
oggetti devono stare sullo stesso ramo della gerarchia), si ha promozione implicita quando si cerca
di assegnare a una variabile di tipo superiore un’espressione di tipo inferiore, mentre è necessaria
una promozione esplicita attraverso il “cast” per assegnare a una variabile di un tipo inferiore
un’espressione (o un valore) di un tipo superiore. (per fare un cast bisogna indicare tra parentesi il
tipo della variabile alla quale si intende “castare” l’oggetto).
Stessa cosa per i tipi numerici primitivi (espliciti ed impliciti); con il tipo riferimento String, invece,
saranno tutte promozioni implicite.
3. Eccezioni:
le eccezioni si dividono in controllate e non controllate, quelle controllate appartengono alla classe
Exception, quelle non controllate appartengono alla classe RuntimeException (che è una
sottoclasse di Exception). I due gruppi si differenziano per il modo in cui vengono trattate dal
compilatore, il quale controlla (per quelle controllate) che ogni costruttore o metodo che possa
sollevare un eccezione ne fornisca un trattamento esplicito per come gestirle (altrimenti segnala un
errore). Il trattamento può avvenire tramite intercettazione (try-catch) o delegandola
esplicitamente al chiamante mediante un’opportuna dichiarazione nell’intestazione del metodo o
del costruttore (throws, che la solleva). Le eccezioni NON controllate non vengono controllate dal
compilatore e quando non sono intercettate, vengono automaticamente delegate al chiamante.
4. Ereditarietà tra classi:
in java esiste una gerarchia tra le classi e tra i tipi riferimento, grazie a questa è possibile avere
superclassi, sottoclassi, supertipi e sottotipi. Ogni sottoclasse erediterà dalla classe che estende e
dalle interfacce che implementa i campi e i metodi, mentre invocherà il costruttore della classe
superiore che a sua volta farà lo stesso (cosa che non accada per le interfacce poiché prive di
costruttori!)
5. Regole dei costruttori:
- ogni classe deve contenere almeno un costruttore, se non viene definito automaticamente il
compilatore ne inserisce uno privo di argomenti (il cui corpo è vuoto);