Si consideri il seguente programma: class Up extends Object { public static int x; public int y; public static void metodo(Up o) {Up w=o.metodo1(x); o.y=w.y+6;} public Up metodo1 (int i) {Up w = new Up(); w.y = x + 5; y=y+1;return w;} {x=1; y=x+3;} } class Down extends Up { public static int z; public Up metodo1(int i) {Up w = new Down(); w.y=z-w.x; y= w.y+x; return w;} {z=3;y=z-1;} } class Princ extends Object { public static void main(){ Up p1 = new Down(); Up p2=new Up(); p2.metodo(p1); p2.metodo(p2);} } Si mostri lo stato (ambiente di classi, heap, pila) dopo l'esecuzione di ciascuna istruzione di main.
Ambiente delle classi 0 Object Up Down Princ Variabili e metodi non staticiVariabili e metodi staticiClasse ereditataNome classe Object Up Object main--- 0x y 2 2 metodoDescr metodo 1 UpDescr Up metodo1Descr metodo1 0z 3 0y UpDescr Up DownDescr Down metodo1Descr metodo1
Descr metodo = Descr metodo1 = Descr Up = Ambiente delle classi 0 Descr metodo1 = Descr Down = Ereditarieta' sul costruttore Overriding del metodo metodo1
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 Down() com Princ l1l1 p1p1 l1l1 ' Down 2y 1 1x 3z
Seconda istruzione del main: Up p2 = new Up() com l1l1 ' Down 2y 1 1x 3z Princ l1l1 p1p1 l2l2 p2p2 l2l2 ' Up 4y
Terza istruzione del main: p2.metodo(p1) com l1l1 1 1x 3z Princ l1l1 p1p1 l2l2 p2p2 l2l2 ' Down 8y ' Up 4y '' Down 2y l3l3
Quarta istruzione del main: p2.metodo(p2) com l1l1 1 1x 3z Princ l1l1 p1p1 l2l2 p2p2 l2l2 ' Down 8y ' Up 12y '' Down 2y l3l3 l4l4 '' Up 6y