Ese 2 (del 31 Marzo 2004)
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 (nei punti (1)--(6) public class Up extends Object { public static int z; public int y; public static void set (int i) {z=i+1;} public Up metodo (int i) { set(i); Up p1=new Up(); p1.y=y+i+1; p1.z=z; \\ (1) return p1;} {y=z;} public class Down extends Up { public int x; public Up metodo (int i) { set(i); Down p1=new Down(); p1.y=y+i; p1.x=z+y; \\ (2) return p1;} {x = 2;} } public class Princ extends Object { public static void main () { Up p1 = new Up (); \\ (3) Up p2 = p1.metodo(2); \\ (4) Up p3= new Down(); \\ (5) Up p4= p3.metodo(5); \\ (6)}
Ambiente delle classi 0 Object Up Down Princ Variabili e metodi non staticVariabili e metodi staticClasse ereditataNome classe Object Up Object main--- 0z Descr set set Descr met1 metodo Descr Up Up 0y x 0y Descr met2 metodo Descr Dow Down Descr Up Up 3 3
Descr set = Descr met1 = Descr Up = Ambiente delle classi 0 Descr met2 = <i, { set(i); Down p1=new Down(); p1.y=y+i; p1.x=z+y; return p1 }, Down> 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. 0y Valutazione del costruttore (come metodo di istanza) : {y=z;} (3)
Il valore ritornato e assegnato alla variabile p1 nel frame al top della pila nel record di attivazione corrente l1l1 Princ l1l1 p1p1 ' Up 0y Istanziato per l 1 : ' = instantiate (,l 1 ) ! Oggetto creato
Seconda Istruzione del main: Up p2 = p1.metodo(2) fmet '(metodo) ' (metodo) = /// Princ l1l1 2i ' Push del Record di attivazione per valutare C 1 com
Stato nel punto (1): C 1 = { set(i); Up p1=new Up(); p1.y=y+i+1; p1.z=z;return p1 ;} /// Princ l1l1 2i l2l2 p1 ' l2l2 '' Up 3y l1l1 ' 0y set(i) modifica lambiente delle classi (vedi dopo) in l2 y ha valore 3 allinizio (y=z) lassegnamento modifica y di l2 non si modifica oltre la var. statica z
Valutazione di set(i): z=i+1 Object Up Down Princ Object Up Object ---main 3z Descr set set Descr met1 metodo Descr Up Up 0y x 0y Descr met2 metodo Descr met1 Down Descr Up Up 3 3 1
Stato nel punto (4) com l2l2 '' Up 3y l1l1 ' 0y 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 3y l1l1 ' 0y l3l3 ' Down 3y 2x Costruttore y=z e x=2 Object Dichiarazione. l1l1 p1p1 l2l2 p2p2 l3l3 p3p3 (5)
Quarta Istruzione del main: Up p4 = p3.metodo(5) com fmet ' (metodo) '' (metodo) = C 2 = { set(i); Down p1=new Down(); p1.y=y+i; p1.x=z+y; return p1 ;} /// Princ l3l3 5i ' Push del Record di attivazione per valutare C 2
Valutazione di set(i): z=i+1 Object Up Down Princ Object Up Object ---main 6z Descr set set Descr met1 metodo Descr Up Up 0y x 0y Descr met2 metodo Descr met1 Down Descr Up Up 3 3 2
Stato nel punto (2): C 2 = { set(i); Down p1=new Down(); p1.y=y+i; p1.x=z+y; return p1 ;} ////// l2l2 l1l1 l4l4 '' Down y 9x ////// l3l3 p1.y=y+i; p1.x=z+y (y di this (l3) vale 3!) 8 /// Princ l3 5i l4l4 p1 '
Stato finale (6) Object Dichiarazione. l1l1 p1p1 l2l2 p2p2 l3l3 p3p3 l4l4 p4p4 instantiate ////// l2l2 l1l1 l4l4 '' Down y 9x ////// l3l3 8