Classi ed Oggetti in Java (Cenni). Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Traduzione ed Interpretazione
Recupero debito quarto anno Primo incontro
Definizione e tipi di implementazione
Linguaggi di programmazione
2/11/2004Laboratorio di Programmazione - Luca Tesei1 Punto della situazione Da dove veniamo, dove andiamo.
Type Checking (1° parte)
Java: programmazione concorrente con condivisione di memoria
Algoritmi e Programmazione
Massa Laura Mela Enrica
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Le gerarchie di tipi.
Metodologie di Programmazione = decomposizione basata su astrazioni
Generalità Linguaggio e Macchina Astratta
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Corso di Informatica (Programmazione)
Introduzione al linguaggio Java
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Derivazione tra classi
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Approfondimento delle classi
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
nome: sequenza di caratteri usata per denotare un oggetto
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Macchine astratte, linguaggi, interpretazione, compilazione
Implementazione di un linguaggio ad alto livello (con riferimento a Java)
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
I nomi in Java F. Bombi 18 novembre novembre 2003.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Sintassi: Programma e classi Program::=prog {ClassDeclList {StatList}} ClassDeclList::=ClassDecl ClassDeclList |  ClassDecl::=class Ide c [StaticMetDefList]
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
1 Osservazioni Generali Struttura di programma Gerarchia di classi: overloading, overriding, e dispatching Analisi ed esecuzione Modificabilità e condivisione.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
1 Lezione IX Lu 10-Ott Convertire numeri in stringhe  Si puo’ usare l’operatore di concatenazione; funziona anche con i numeri:  In alternativa.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Programmazione Attività di progettazione ed implementazione di programmi I programmi permettono di realizzare funzioni complesse su un hardware in grado.
Ese 1 (del 31 Marzo 2004). Il compilatore Non esegue il programma, non guarda i valori che possono assumere di volta in volta le variabili, non fa assunzioni.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Cose nuove di Java (prima a chiacchiera, poi formalmente)
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
1 Macchine astratte, linguaggi, interpretazione, compilazione.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Introduzione a Java. Java Linguaggio Object-Oriented La maggior parte dei dati manipolati dai programmi e’ contenuta in oggetti La principale forma di.
1 Semantica Operazionale di un frammento di Java: intro estensione (con piccole varianti) di quella di FP | v |
1 Semantica Operazionale di un frammento di Java: intro estensione (con piccole varianti) di quella di FP | v |
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

Classi ed Oggetti in Java (Cenni)

Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti

Implementare un linguaggio implementazione un linguaggio L su una macchina ospite M O realizzare la macchina astratta M L sulla macchina ospite M O tipicamente L linguaggio ad alto livello M O esegue un linguaggio piu’ a basso livello (e.g. linguaggio macchina?)

Macchina Astratta  M L una collezione di strutture dati ed algoritmi in grado di memorizzare ed eseguire programmi di L §componenti della macchina astratta l interprete l memoria (dati e programmi) l controllo l operazioni “primitive” (del linguaggio della macchina ospite)

Macchine astratta Interprete Programma Dati op1 op2 …... opn Controllo Operazioni primitive Memoria

L’interprete controllo operazioni start stop acquisisci la prossima istruzione decodifica acquisisci gli operandi seleziona esegui op1esegui op2esegui opnesegui alt... memorizza il risultato

Dal linguaggio alla macchina astratta L linguaggio M L macchina astratta di L implementazione di L = realizzazione di M L su una macchina ospite M O se L è un linguaggio ad alto livello ed M O è una macchina “fisica” –l’interprete di M L è necessariamente diverso dall’interprete di M O –come si implementa?

Implementare un linguaggio implementazione di L 1: interprete (puro) –M L è realizzata su M O in modo interpretativo –scarsa efficienza, soprattutto per colpa dell’interprete (ciclo di decodifica) implementazione di L 2: compilatore (puro) –i programmi di L sono tradotti in programmi funzionalmente equivalenti nel linguaggio macchina di M O –i programmi tradotti sono eseguiti direttamente su M O M L non viene realizzata –il problema è quello della dimensione del codice prodotto due casi limite che nella realtà non esistono quasi mai: c’è sempre una macchina intermedia che estende eventualmente la macchina ospite in alcuni componenti

Implementazione mista MLML MIMI MOMO Programma in LProgramma in L M I realizzazione traduzione quando l’interprete della macchina intermedia M I non coincide con quello della macchina ospite M O esiste un ciclo di interpretazione del linguaggio intermedio L M I realizzato su M O

Interpretazione e traduzione pure Casi limite (possibili solo se i linguaggi sono molto vicini) M L = M I interpretazione pura M O = M I traduzione pura MLML MIMI MOMO Programma in LProgramma in L M I realizzazione traduzione

Implementazioni miste: vantaggi –per ottenere un codice tradotto più compatto –per facilitare la portabilità su diverse macchine ospiti si deve riimplementare l’interprete del linguaggio intermedio non è necessario riimplementare il traduttore –su una tipica macchina ospite e’ piu’ semplice realizzare l’interprete per ill linguaggio intermedio (piu’ vicino al linguaggio della macchina ospite).

L’implementazione di Java è un’implementazione mista –traduzione dei programmi da Java a byte-code, linguaggio macchina di una macchina intermedia chiamata Java Virtual Machine –i programmi byte-code sono interpretati

Vantaggi su una tipica macchina ospite, è più semplice realizzare l’interprete di byte-code che l’interprete di Java byte-code piu’ a basso livello

Vantaggi inoltre si possono effettuare una volta per tutte (a tempo di traduzione, staticamente) analisi, verifiche e ottimizzazioni che migliorano –l’affidabilità dei programmi (assenza di errori run-time) –l’efficienza dell’esecuzione (meno controlli run-time) varie proprietà interessate –controllo dei tipi –controllo sull’uso dei nomi e loro risoluzione “statica” –….

Analisi statica in Java Java è fortemente tipato –il type checking può essere in gran parte effettuato dal traduttore e sparire quindi dal byte-code generato come vedremo pero’ le relazioni di subtyping permettono che una entità abbia un tipo vero (tipo effettivo) diverso da quello apparente (tipo apparente) di conseguenza, alcune questioni legate ai tipi possono solo essere risolte a tempo di esecuzione –possono verificarsi errori di tipo a tempo di esecuzione rilevati da opportune eccezione

Ruolo delle classi in Java I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure stand-alone (metodi statici) oggetti (tramite variabili e metodi d’istanza, che definiscono il loro stato interno e le operazioni) Le due funzionalita’ possono coesistere all’interno di una stessa classe Una classe puo’ contenere variabili statiche e d’istanza Analogo per i metodi

Procedure Stand-alone Collezione di metodi statici (non ci sono variabili e metodi d’istanza) public class Num { public static int gcd (int n, int d) { while (n != d) if (n > d) n = n - d; else d = d - n; return n;} public static boolean isPrime (int p) { // implementazione} }

Oggetti Servono per creare nuovi tipi di dato con relative operazioni Vogliamo realizzare una classe BankAccount i cui oggetti sono dei semplici conti bancari. Vogliamo le seguenti operazioni  depositare denaro  prelevare denaro  chiedere il saldo corrente

Come si procede? Variabili d’istanza devono modellare lo stato degli oggetti Metodi d’istanza devo modellare le operazioni richieste Costruttore (o costruttori) per creare un nuovo oggetto della classe

Una possibile implementazione public class BankAccount { public double balance; //il saldo corrente // costruttori public BankAccount(double initial){ balance=initial; }

Una possibile implementazione // metodi public void deposit(double amount) { balance = balance + amount; } public void withdraw(double amount) { balance = balance - amount; } public double getBalance() { return balance; }

Oggetti Gli oggetti istanze della classe si creano tramite new Hanno il tipo nome della classe BankAccount p1= new BankAccount(1000); p1 e’ dichiarato con tipo BankAccount Nel seguito diremo definire una classe o definire un tipo

Variabili d’istanza Le variabili d’istanza appartengono agli oggetti Ogni oggetto ha la propria variabile d’istanza balance BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000);

Come si accede? Dato che le variabili d’istanza appartengono agli oggetti vi si accede tramite il riferimento all’oggetto (che puo’ anche essere implicito) Supponiamo per esempio di essere in un metodo esterno alla classe (tipo main) tramite il riferimento all’oggetto BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000); if (p1.balance=p2.balance) {…}

ATTENZIONE: Specificatore di Accesso public (si puo’ accedere da qualsiasi metodo della classe o non ) private (si puo’ accedere solo da metodi della classe)

Esempio Supponiamo che balance sia private allora il seguente accesso dal metodo main non e’ legale (viene rilevato dal compilatore) BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000); if (p1.balance=p2.balance) {…}

Ruolo di private Come vedremo e’ consigliabile sempre usare variabili d’istanza private Impediscono l’accesso diretto allo stato degli oggetti che puo’ essere modificato solo dai suoi metodi d’istanza (tipo per esempio deposit e withdraw) Creano un incapsulamento degli oggetti (fondamentale per garantirne un corretto funzionamento)

Metodi d’istanza I metodi d’istanza eseguono operazioni su un determinato oggetto (che e’ riferito come this nel suo corpo) devono essere chiamati con il riferimento all’oggetto (che puo’ anche essere implicito) per esempio da un metodo esterno alla classe come main BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000); p1.deposit(2000); p1.deposit(3000);

Specificatori di Accesso Valgono le stesse regole che per le variabili I metodi private possono essere chiamati solo dall’interno della classe Non fanno parte dell’interfaccia pubblica della classe (quindi delle operazioni che puo’ usare un utente del tipo di dato)

Metodi e Variabili Statici Variabili e metodi statici appartengono alla classe in cui sono dichiarati Sono quindi condivisi tra tutti gli oggetti della classe A differenza delle variabili e dei metodi di istanza che appartengono agli oggetti (istanze della classe). Come vedremo nella semantica stanno nell’ambiente delle classi e non nella heap

Esempio: var. statiche Supponiamo di volere modificare BankAccount in modo che ogni conto abbia una codice identificativo, ognuno diverso dagli altri Si puo’ utilizzare una variabile statica che mantiene il valore del primo numero intero fresh (non e’ ancora stato assegnato)

Una possibile implementazione public class BankAccount { public double balance; //il saldo corrente public int miocodice; //il codice del conto public static int codice; //il primo codice disponibile La variabile statica e’ unica e condivisa tra tutti i conti questo garantisce che il valore non sia stato gia’ usato La variabile d’istanza miocodice mantiene invece il codice dei singoli conti

Costruttore public BankAccount(double initial){ balance=initial; miocodice=codice; codice++; } La variabile statica e’ unica e condivisa tra tutti i conti Viene incrementata ogni volta che viene creato un nuovo conto

Specificatori di accesso Valgono le stesse regole viste per le variabili ed i metodi di istanza

Variabili e Metodi Statici: come si accede? Supponiamo per esempio di essere in un metodo esterno alla classe (tipo main) e che la variabile sia public (anche se non ha senso da un punto di vista di sicurezza) Come facciamo a riferirci alla variabile codice ?

Tramite la classe variabile statica BankAccount.codice=1; analogamente si potrebbe invocare un metodo statico della classe BankAccount

Regole di Visibilita’ dei Nomi Sono quelle verificate staticamente dal compilatore (si chiamano regole di scoping) Verifica che ogni accesso ad un nome (di variabile o metodo) sia legale, ovvero il legame tra le dichiarazioni e l’uso dei nomi

Regole di Visibililita’ dei Nomi E’ necessario richiamare le regole di base (le vedremo per bene nella semantica di MP) Sono un po’ piu’ complicate di quelle che avete visto fino ad ora (erano semplificate a scopo didattico) Complicate dalla coesistenza di nomi statici e d’istanza Tralasciando i vincoli imposti dagli specificatori di accesso

A cosa servono? Stiamo scrivendo un metodo Come facciamo a capire se un accesso del seguente tipo e’ legale? Path.I variabile Path.I(ListP) chiamata di metodo A quale identificatore I accedendo?

Nota E’ complicato perche’ I potrebbe essere statico o d’istanza o potrebbe essere una variabile locale del metodo Dipende dal Path e dal tipo di metodo (statico o d’istanza)

Cosa puo’ indicare un path? Accesso diretto (path vuoto) I Riferimento ad un oggetto this.I p1.I Riferimento ad una classe BankAccount.I

Per semplicare Vediamo le regole per le variabili Per i metodi e’ analogo

Path Vuoto I potrebbe essere una variabile locale o un parametro del metodo una variabile che si vede dalla classe (se il metodo e’ statico) una variabile che si vede dall’oggetto su cui il metodo e’ eseguito (se il metodo e’ d’istanza o e’ un costruttore)

Cosa e’ visibile da un oggetto? I suoi nomi d’istanza I nomi statici dichiarati nella classe a cui appartiene (perche’ sono condivise tra tutti gli oggetti)

Costruttore public BankAccount(double initial){ balance=initial; miocodice=codice; codice++; } Accesso diretto alla variabile d’istanza miocodice (this non e’ necessario ) si riferisce implicitamente a quella dell’oggetto creato Accesso diretto alla variabile statica codice che e’ condivisa e visibile tra tutti gli oggetti della classe (Bankaccount non e’ necessario )

Cosa e’ visibile da una classe? I suoi nomi statici Non sono visibili nomi d’istanza (sono relativi agli oggetti)

Metodo statico di BankAccount public static void incr(int x){ codice=x; } Accesso diretto alla variabile statica codice che appartiene alla classe del metodo Non potremo accedere direttamente alla variabile d’istanza miocodice (non ci sono oggetti di riferimento)

Path Classe Vediamo quello che si vede dalla classe Per esempio da main: BankAccount.codice=1; (accesso legale) BankAccount.balance=1; (accesso illegale)

Path Oggetto Vediamo quello che si vede dall’oggetto Per esempio da main: BankAccount p1=new Bankaccount(1000); p1.codice=1; (accesso legale) p1.balance=1; (accesso legale)

Conclusione La coesistenza di nomi statici e d’istanza complica il linguaggio Nelle prossime lezioni vedremo come estendere le regole della semantica di FP in modo da trattare espressioni del tipo Path.I Path.I(ListP)