PROGRAMMAZIONE 2 5. Dynamic dispatch

Похожие документы
Programmazione Java Struttura di una classe, Costruttore, Riferimento this

La Gestione della Memoria. Carla Binucci e Walter Didimo

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Lezione 9 programmazione in Java Classi come contenitori

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Esercizi della lezione 5 di Java

14 - Metodi e Costruttori

Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals()

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Esercitazione 2: Java Thread. Java Thread. Java Thread. Un thread:

Programmazione con Java

Perché il linguaggio C?

Definizione di classi. Walter Didimo

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

Le basi del linguaggio Java

Riassunto. La programmazione OO. Oggi. Esempio

Programmazione Orientata agli Oggetti in Linguaggio Java

18 - Classi parzialmente definite: Classi Astratte e Interfacce

Linguaggi di Programmazione I Lezione 10

Marco Faella Introduzione al corso

Programmazione ad oggetti

Introduzione. Java. Esempio. Esempio

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Gerarchia delle classi Classi astratte Interfacce (Eccezioni) Laboratorio di Programmazione - Esercitazio 1

Prova d Esame Compito A

Транскрипт:

PROGRAMMAZIONE 2 5. Dynamic dispatch PR2 2017-2018 1 Cosa significa? La dichiarazione di una variabile non determina in maniera univoca il >po dell oggeao che la variabile riferisce Cerchiamo di capire quale è il problema Class B extends class A // L estensione riscrive il metodo m( ) Supponiamo di creare un oggeao di >po A A a = new A( ) e di fare diverse operazioni su a che coinvolgono anche aliasing con oggem di >po B. Poi invochiamo a.m( ). Quale metodo è effemvamente invocato? PR2 2017-2018 2 1

Esempio (in un unico file) public class DynamicBindingTest { public sta>c void main(string[ ] args) { Vehicle vehicle = new Car( ); // Il >po sta@co è Vehicle // il >po dinamico è Car vehicle.start( ); //Quale metodo viene invocato? // Quello di Car o quello di Vehicle? class Vehicle { public void start( ) { System.out.println("Inside start method of Vehicle"); class Car extends Vehicle { public void start( ) { System.out.println("Inside start method of Car"); PR2 2017-2018 3 Esempio (in un unico file) public class DynamicBindingTest { public sta>c void main(string[ ] args) { Vehicle vehicle = new Car( ); // Il >po sta@co è Vehicle // il >po dinamico è Car vehicle.start( ); //Quale metodo viene invocato? // Quello di Car o quello di Vehicle? class Vehicle { public void start( ) { Output: Inside start method of Car System.out.println("Inside start method of Vehicle"); class Car extends Vehicle { public void start( ) { System.out.println("Inside start method of Car"); PR2 2017-2018 4 2

Intuizione Invocazione obj.m( ) A tempo di esecuzione viene u>lizzato il >po dinamico dell oggeao obj per determinare nella gerarchia delle classi quale è il metodo più specifico da invocare PR2 2017-2018 5 B è un so#o$po di A A e B includono la definizione del metodo m A a = new A ( ); B b = new B ( ); a.m( ); b.m( ); a = b; a.m( ); Viene invocato il metodo della classe A Viene invocato il metodo della classe B Viene invocato il metodo della classe B PR2 2017-2018 6 3

Dynamic Dispatch Viene ricercato il metodo lungo la gerarchia a par>re dal >po dinamico dell oggeao A Tipo sta>co Tipo dinamico a A a = new A( ); B b = new B( ); B Tipo sta>co b a.m( ); b.m( ); Tipo dinamico PR2 2017-2018 7 Dynamic Dispatch Viene ricercato il metodo lungo la gerarchia a par>re dal >po dinamico dell oggeao A Tipo sta>co Tipo dinamico a A a = new A( ); B b = new B( ); B Tipo sta>co b a.m( ); b.m( ); a = b; Tipo dinamico Tipo sta>co di a è A Tipo dinamico di a è B PR2 2017-2018 8 4

Sta>c vs dynamic Il compilatore usa i >pi sta>ci per determinare la correaezza delle invocazioni dei metodi La macchina virtuale usa il >po dinamico per determinare l effemvo metodo da invocare PR2 2017-2018 9 La tabella dei metodi Per comprendere gli esempi preceden> va estesa la ASM di Java con un ulteriore componente: la tabella dei metodi (a volte chiamata tabella della classe) La tabella con>ene il codice dei metodi defini> nella classe, e tuae le componen> sta>che definite nella classe stessa La tabella con>ene un puntatore alla classe padre L insieme delle tabelle è pertanto un albero (per quale ragione?) PR2 2017-2018 10 5

Esempio public class Counter { private int x; public Counter( ) { x = 0; public void incby(int d) { x = x + d; public int get( ) { return x; public class Decr extends Counter { private int y; public Decr (int inity) { super( ); y = inity; public void dec( ) { incby(-y); PR2 2017-2018 11 Tabella dei metodi Le tabelle dei metodi sono allocate sullo heap (memoria dinamica) L invocazione del metodo costruaore determina l allocazione sullo heap della tabella dei metodi associata alla classe dell oggeao creato (se non è già presente) Ogni oggeao sullo heap con>ene un puntore alla tabella dei metodi del suo >po dinamico PR2 2017-2018 12 6

Dispatch L invocazione del metodo o.m( ) u>lizza il puntatore alla tabella dei metodi per effeauare l operazione di dispatch ricerca sulla gerarchia dell oggeao a par>re dalla tabella dei metodi associata al >po dinamico dell oggeao o da notare l u>lizzo di this per determinare l oggeao che invoca il metodo PR2 2017-2018 13 public class Counter extends Object { private int x; public Counter( ) { super( ); this.x = 0; public void incby(int d) { this.x = this.x + d; public int get( ) { return this.x; public class Decr extends Counter { private int y; public Decr (int inity) { super( ); this.y = inity; public void dec() { this.incby(-this.y); // nel main Decr d = new Decr(2); d.dec( ); int x = d.get(); PR2 2017-2018 14 7

Animazione dell esecuzione PR2 2017-2018 15 PR2 2017-2018 16 8

public Decr (int inity) { super( ); this.y = inity; PR2 2017-2018 17 PR2 2017-2018 18 9

NB: il codice della con>nuazione è memorizzato sullo stack PR2 2017-2018 19 Invocazione a super PR2 2017-2018 20 10

PR2 2017-2018 21 Si esegue la con>nuazione PR2 2017-2018 22 11

Si conclude la fase di inizializzazione con l assegnamento al campo y PR2 2017-2018 23 Viene allocato sullo stack l ambiente che con>ene il legame per la variabile d col >po dinamico Decr PR2 2017-2018 24 12

Invocazione tramite dynamic dispatch e ricerca del metodo su gerarchia dinamica PR2 2017-2018 25 Invocazione del metodo PR2 2017-2018 26 13

PR2 2017-2018 27 PR2 2017-2018 28 14

PR2 2017-2018 29 15