Metodologie di Programmazione Esercizi sulla semantica di Java
Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) durante la valutazione delle seguenti dichiarazioni di classe e l'esecuzione del metodo main: public class Up extends Object { public static int x; public int y; public static void set (int i) {x=i;} public Up metodo (Up o) {Up w = new Up(); w.y=y+o.y; return w;} {y=x+1;} } public class Down extends Up { public int z; public Up metodo (Up o) {y=o.y; z=x+z; return o;} {z=3;} } public class Princ extends Object { public static void main() { Up p1 = new Up(); Up p2 = p1.metodo(p1); Up p3 = new Down(); Down.set(5); Down p4 = new Down(); p3 = (Down) p4.metodo(p3); }
Ambiente delle classi 0 Object Up Down Princ Variabili e metodi non staticVariabili e metodi staticClasse ereditataNome classe Object Up Object main--- 0x Descr set set Descr met1 metodo Descr Up Up 0y 11 22 11 22 0z 0y Descr met2 metodo Descr Dow Down Descr Up Up 33 33
Descr set = Descr met1 = Descr Up = Ambiente delle classi 0 Descr met2 = Descr Down = Ereditarieta' sul costruttore Overriding del metodo metodo
Stato iniziale: : Ambiente delle classi : Heap vuota : Contiene il record di attivazione di main Princ Pila dei Frames vuota
Prima Istruzione del main: Up p1 = new Up(); com Creazione di un oggetto: l1l1 '' Up Copia del frame e dell'ambiente dei metodi di istanza da Up. 1y Valutazione del costruttore (come metodo di istanza) : {y=x+1;}
Il valore ritornato e’ assegnato alla variabile p1 nel frame al top della pila nel record di attivazione corrente l1l1 Princ l1l1 p1p1 Modifica della pila '' Up 1y Istanziato per l 1 : ' = instantiate ( ,l 1 ) !
Seconda Istruzione del main: Up p2 = p1.metodo(p1); com Valutazione dell’espressione p1.metodo(p1). Il metodo funzionale e’ simile ai metodi void, ritorna un valore. Dichiarazione: il valore e’ associato alla variabile p2 nel frame al top della pila dei frames nel record di attivazione corrente
Valutazione dell’espressione: Ricerca del metodo a partire da l 1 (risultato della valutazione del path) fmet '(metodo) ' (metodo) = C 1 = {Up w = new Up(); w.y=y+o.y; return w;} com /// Princ l1l1 l1l1 o ' p1.metodo(p1) Push del Record di attivazione
Valutazione del corpo del metodo: C 1 = {Up w = new Up(); w.y=y+o.y; return w;} /// Princ l1l1 l1l1 o l2l2 w '' w.y = y + o.y l2l2 this (l 1 ) parametro (l 1 ) 11 l2l2 '' Up 2y l1l1 '' 1y
Dichiarazione com l2l2 '' Up 2y l1l1 '' 1y Princ l1l1 p1p1 l2l2 p2p2 Istanziato per l 2 : '' = instantiate ( ,l 2 ) !
Terza Istruzione del main: Up p3 = new Down(); com Istanziato per l 3 : ' = instantiate ( ,l 3 ) ! l2l2 '' Up 2y l1l1 '' 1y l3l3 '' Down 1y 3z Creazione nuovo oggetto. Object Dichiarazione. l1l1 p1p1 l2l2 p2p2 l3l3 p3p3
Quarta Istruzione del main: Down.set(5); com Object Up Down Princ Object Up Object ---main 0x Descr set set Descr met1 metodo Descr Up Up 0y 11 22 11 22 0z 0y Descr met2 metodo Descr met1 Down Descr Up Up 33 33 00 Modifica ambiente delle classi:
Quarta Istruzione del main: Down.set(5); com Object Up Down Princ Object Up Object ---main 5x Descr set set Descr met1 metodo Descr Up Up 0y 11 22 11 22 0z 0y Descr met2 metodo Descr met1 Down Descr Up Up 33 33 11 Modifica ambiente delle classi:
Quinta Istruzione del main: Down p4 = new Down(); com Istanziato per l 4 : '' = instantiate ( ,l 4 ) ! Creazione nuovo oggetto. ////// l2l2 l1l1 l4l4 '' Down 6y 3z ////// l3l3 {y = x + 1;} (in 1 x vale 5) ! Object Dichiarazione. l1l1 p1p1 l2l2 p2p2 l3l3 p3p3 l4l4 p4p4
Sesta Istruzione del main: p3 = (Down) p4.metodo(p3); com Valutazione del metodo funzionale: fmet '' (metodo) La ricerca parte da l 4 ! '' (metodo) = C 2 = {y = o.y; z = x + z; return o;} Modifica solo la heap, perche’ il metodo ritorna l3 !!!
Valutazione del corpo del metodo com /// Princ l4l4 l3l3 o ' Push del Record di attivazione La valutazione di {y = o.y; z = x + z; return o;} modifica l'oggetto in l 4 e ritorna o (l 3 ) non modificato! this (l 4 ) parametro (l 3 )
Object Invariato l1l1 p1p1 l2l2 p2p2 l3l3 p3p3 l4l4 p4p4 Modifica di l4 ////// l2l2 l1l1 l4l4 '' Down 1y 8z ////// l3l3 {y = o.y; z=x+z;} (in 1 x vale 5) !