Esercizio 2
Si mostri l’evoluzione dello stato (ambiente di classi, heap, pila) durante la valutazione delle seguenti dichiarazioni di classe nei punti (1)-(6) durante l’esecuzione del metodo main. public class Up extends Object { public static int x; public int y; public Up met1() { int y=0; y=this.y+3; this.y=x+2; return this; (5) } public void met2() {x=y+y; y=this.y+1;} {x=2;y=x+1;} } public class Down extends Up { public int z; public Up met1() {int y=0; met2(); (6) this.y=y+1; z=y + this.y; return this; } {z=y-1;} } public class Princ extends Object { public static void main() { Up p1 = new Down(); (1) Up p2=p1.met1(); (2) Up p3=new Up(); (3) p1=p3.met1(); (4) } }
Ambiente delle classi 0 Nome classe Classe ereditata Variabili e metodi statici Variabili e metodi non statici Princ Object main --- Down y Up DescrUp z Down DescrDow Up 3 met1 Descrmet1 met2 Descrmet2 m2 Up y Up DescrUp x met1 Descrmet1 Object 2 1 met2 Descrmet2 m1 Object
Ambiente delle classi 0 Descrmet1 = < -, {int y=0; y=this.y+3; this.y=x+2; return this;},Up> Descrmet2 = <-, {x=y+y; y=this.y+1;}, Up> DescrUp = <-, {x=2;y=x+1}, Up> Descrmet1 = <-, {int y=0; met2(); this.y=y+1; z=y + this.y; return this;}, Down> Overriding del metodo met1 DescrDown = <-, {x=2;y=x+1; z=y-1}, Down> Ereditarieta' sul costruttore
Stato iniziale: <0 , s0 , x0 > r0 : Ambiente delle classi x0 : Heap vuota s0 : Contiene il record di attivazione di main Princ Pila dei Frames vuota
Prima Istruzione del main: Up p1 = new Down() (1) < Up p1 = new Down();,0 , s0 , x0 > com < 1 , s1 , x1 > Down 3 y l1 m2' 2 z x1 Creazione di un oggetto: Copia del frame e dell'ambiente dei metodi di istanza da Down. Valutazione del costruttore (come metodo di istanza) : {x=2;y=x+1;z=y-1;}
Princ m2' m2' = instantiate (m2,l1) ! Il valore ritornato e’ assegnato alla variabile p1 nel frame al top della pila nel record di attivazione corrente Princ Down 3 y l1 p1 l1 m2' 2 z x1 s1 Istanziato per l1: m2' = instantiate (m2,l1) ! 1 2 x
Seconda Istruzione del main: Up p2 = p1.met1() (2) < Up p2 = p1.met1(); , 1 , s1 , x1 > com < 2, s2 , x2 > < met1, l1, 1 , s1 , x1 > fmetm2'(met1) Stato nel punto (6): l1 y Down 2 6 x 4 y Princ l1 m2' p1 l1 2 z x1 ' s1 '
Stato nel punto (2): < 2 , s2, x2 > 6 x Down Princ p1 l1 1 y p2 l1 m2' 1 z x2 s2
Terza Istruzione del main: Up p3 = new Up() (3) < Up p3 = new Up(); , 2 , s2 , x2 > com < 3 , s3 , x3 > l1 x3 1 y Down Princ m2' 1 z l2 l1 p1 p2 l2 p3 3 2 x Up 3 y m2'' s3
Quarta Istruzione del main: Up p1 = p3.met1() (4) < Up p1 = p3.met1(), 3 , s3 , x3 > com < 3, s4 , x4 > < met1, l2, 3 , s3 , x3 > fmet m2'' (met1) Stato nel punto (5): l2 l1 x4 1 y Down y 6 3 2 x m2' 1 z Princ l2 Up /// 4 y m2'' s3 '
Princ m2' m2'' Stato nel punto (4) l1 x4 1 y Down 1 z l2 3 2 x Up 4 y