LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.

Slides:



Advertisements
Presentazioni simili
Costruttori e Distruttori
Advertisements

Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
Fondamenti di Informatica
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
1 Lezione XIII Lu 17-Nov-2005 Programmare le 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.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Astrazione procedurale ed eccezioni
Una "vera" classe.. ..un esempio pratico: la calcolatrice
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Liste di Interi Esercitazione. IntList Lista di interi Problema tipico: memorizzare una sequenza di valori [6,0,9,3….9] Vediamo un tipo di dato utile.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
1 Gerarchie e polimorfismo: liste. 2 Generalizzare le liste di interi  List 4 lista di oggetti –non modificabile 4 vorremo poi definire un sottotipo.
Esercitazione Object, Vettori, Liste. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo lo.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
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.
LIP: 9 Maggio Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
LIP: 8 Marzo 2005 Vettori. Abbiamo visto L’uso di Vector come alternativa all’uso di arrays Rivediamo l’esercizio dell’altra volta.
Esercitazione del 7 marzo 2008 Ereditarieta’. Esercizio: soluzione Implementare la seguente specifica che definisce un tipo di dato Libro.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Cose nuove di Java (prima a chiacchiera, poi formalmente)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
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.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
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.
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.
Alcune Classi Standard Object, Vettori. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
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.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
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.
LIP: 18 Aprile 2008 Interfacce. Rappresentazione Lista val next vuota Lista vuota: any true Lista non vuota: any true 154 false 24 false.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Transcript della presentazione:

LIP: 1 Marzo 2005 Classe Object e Vettori

Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu efficiente usando un nuovo tipo di dato ( Vector )

Classe Object La classe Object è la superclasse, diretta o indiretta, di ciascuna classe in Java, quindi Object è supertipo di qualsiasi tipo (che definisce oggetti). Grazie al meccanismo dell'ereditarietà i suoi metodi sono ereditati da tutti i tipi (che definiscono oggetti). ad una variabile di tipo Object possiamo assegnare oggetti di qualsiasi tipo (principio di sostituzione)

Attenzione I tipi primitivi int, boolean, double non sono sottotipi di Object, non sono oggetti (vedi la differenza nella semantica di FP) String, Integer sono esempi di tipi primitivi sottotipi di Object Abbonato, Elenco sono esempi di tipi non primitivi sottotipi di Object

Sono metodi ereditati da tutti i sottotipi I metodi più utili sono: public String toString() { \\EFFECTS: restituisce una rappresentazione\\EFFECTS dell'oggetto this in forma di stringa. } public boolean equals(Object obj) \\EFFECTS :verifica se l'oggetto this è uguale a obj.\\EFFECTS Metodi Eredidati da Object

Commenti a toString() La definizione del metodo nella classe Object restituisce una stringa che contiene il nome della classe dell'oggetto su cui il metodo è invocato ed una rappresentazione esadecimale del codice hash dell'oggetto (indirizzo in memoria dell'oggetto). Questo accade perché la classe Object non può conoscere la struttura dell'oggetto. Il metodo ereditato e poco utile. Il metodo deve quindi essere sovrascritto in ogni classe che lo usa per ottenere un risultato significativo. Tipicamente, di un oggetto si vogliono mostrare (nella stringa restituita) i valori delle variabili d'istanza o comunque una informazione significativa che descriva lo stato interno

Commenti ad Concettualmente, l'invocazione.equals( ) del metodo equals dovrebbe restituire true quando il contenuto dei due oggetti è uguale (non il riferimento, come per l'operatore ==). L'esempio tipico è il confronto tra stringhe. Daltra parte il metodo equals della classe Object, e implementato non potendo fare alcuna assunzione sulla struttura interna degli oggetti su cui viene invocato (utilizza semplicemente l'operatore == per confrontarli.) Deve quindi essere sovrascritto in modo opportuno nel sottotipo (overriding) a seconda delle caretteristiche degli oggetti Per il tipo String il metodo e gia ridefinito in modo primitivo equals

Metodo equals Notiamo che il parametro del metodo equals ha tipo Object Lo possiamo chiamare su oggetti di ogni tipo (come String ) proprio grazie al principio di sostituzione Il confronto con == va bene solo per testare se un oggetto ha riferimento null

Tipo La classe java.util.Vector definisce degli oggetti, chiamati vettori ( Vector ), che consentono di rappresentare sequenze di oggetti di lunghezza variabile. Simili agli array a parte il fatto che -la dimensione di un vettore può variare durante l'esecuzione di un programma - non vanno creati per un tipo prefissato, le posizioni del Vector hanno un tipo generico Object -quindi possono contenere oggetti di ogni tipo anche tra loro disomogenei (tipo String o Integer) Vector

Costruttori e Metodi (alcuni) public Vector (){ \\EFFECTS\\EFFECTS: crea un vettore vuoto} Notate che a differenza che per gli arrays non e necessario fissare al momento della creazione la dimensione Ci sono anche altri costruttori tipo quelli degli arrays che permettono di creare un vettore vuoto ma con una certa capacita (dato numero di posizioni allocate ma vuote). Serve solo per avere implementazioni piu o meno efficienti (per ora lo ignoriamo)

public int size (){ \\EFFECTS\\EFFECTS: restituisce il numero di elementi presenti nel vettore} public Object elementAt (int index){ \\EFFECTS\\EFFECTS: restituisce l'elemento di indice index } public void setElementAt (Object obj, int index){ \\EFFECTS\\EFFECTS: sostituisce obj all'oggetto della posizione index} Se index e fuori dal size del vettore viene sollevata una eccezione come per gli arrays Metodi simili a quelli dellarray

public void insertElementAt (Object obj, int index){ \\MODIFIES:this \\EFFECTS: inserisce obj nella posizione index e sposta tutti gli\\EFFECTS elementi, da index in poi, di una posizione} public void addElement (Object obj){ \\MODIFIES:this \\EFFECTS\\EFFECTS: aggiunge una posizione alla fine che contiene obj } public void removeElementAt (int index){ \\MODIFIES:this \\EFFECTS: rimuove l'oggetto presente nella posizione index e sposta all'indietro di una posizione tutti gli elementi successivi a quello rimosso} public boolean removeElement (Object obj){ \\MODIFIES:this \\EFFECTS: rimuove la prima occorrenza dell'oggetto obj se presente restituendo true,oppure restituisce false} Metodi per rimuovere e aggiungere

Differenze con gli Arrays Rifate lesercizio dell Elenco di abbonati usando un Vector invece di un array Lo stato interno di un oggetto di tipo Elenco e descritto da un Vector di Abbonato (invece che da un array) public Vector persone; // variabile distanza Essendo Abbonato sottotipo di Object possiamo usare un Vector per memorizzare abbonati (per esempio per aggiungere) persone.addElement(new Abbonato(12,15))

Attenzione quando usiamo i metodi della classe Vector restituiscono valori di tipo Object. Cosa succede se vogliamo leggere il nome del primo Abbonato del Vector? // accesso alla variabile distanza di Abbonato che memorizza il nome int n= persone.elementAt(1).nome; Il compilatore non puo sapere quale tipo di valori sono correntemente memorizzati nella prima posizione del Vector, quindi guarda il tipo restituito dal metodo elementAt e un metodo che restituisce un valore di tipo Object, quindi rileva un errore di tipo (Object non ha una variabile distanza nome)

Quindi quando usiamo i metodi della classe Vector bisogna usare cast opportuni Abbonato a= (Abbonato) persone.elementAt(1); a.nome…….// accesso alla variabile distanza (senza il cast darebbe un errore) In questo modo possiamo aggirare il problema della differenza tra tipo effettivo (Abbonato) e tipo apparente (Object)

Commenti Nel momento in cui cambiate limplementazione del tipo di dato Elenco deve essere rifatto il programma che il testing? Dipende da come lo avete fatto (se accedeva alla variabile distanza persone di tipo array della classe Elenco..chiaramente non va piu bene) Per esempio si poteva verificare la dimensione corrente dellarray per testare i metodi definiti Elenco e=new Elenco(); System.out.println(e.persone.length); e.inserisci(12); System.out.println(e.persone.length);

Commenti Notiamo che il metodo di testing puo accedere alla variabile distanza persona perche questa e public Questo suggerisce che non e una buona pratica di programmazione rendere visibili le variabili che implementano lo stato interno di un tipo di dato Infatti se lutente del tipo di dato (p.e. Elenco) puo accedere alle variabili distanza che lo implementano tutto il codice diventa dipendente dalla implementazione del tipo di dato Quando limplementazione del tipo di dato dovesse (come tipicamente sara) essere migliorata-modificata tutto il codice che la usa e che dipende dallimplementazione dovra essere riscritto Come succede in questo caso col metodo di testing E fondamentale invece (come vedremo) rendere le varie parti indipendenti dalla loro implementazione interna usando il piu possibile specificatori di accesso private

Sulla implementazione di Elenco Per quelli che se la sentono (tipo che hanno gia finito lesercizio dellaltra volta) potete fare una implementazione un po piu efficiente Usando un Vector in cui gli Abbonati sono mantenuti in modo ordinato rispetto al loro nome (come in un elenco del telefono vero) In tale caso i metodi di ricerca, inserimento e rimozione devono essere fatti in modo da mantenere lordinamento e da sfruttarlo Per Esempio Se gli Abbonati sono ordinati in base al nome per cercare un certo Abbonato non dovremo sempre scorrere tutto il vettore

Classe Elenco 1 import java.util.*; import java.io.*; public class Elenco{ public Vector persone; // variabile distanza public static int numero=1; // costruttore public Elenco(){ persone=new Vector(); } Lo stato interno di un oggetto di tipo Elenco e descritto da un Vector persone Le variabili distanza devono essere inizializzate dal costruttore (invocato per creare un nuovo oggetto) persone viene inizializzato al vettore vuoto tramite il costruttore di Vector new Vector(); Se non creiamo il vector il riferimento rimane null non possiamo farci nulla!

Classe Elenco 2 \\metodi public int cercanum(int s){ for (int j=0; j< persone.length;j++){ Abbonato a =(Abbonato) persone.elementAt(j); if (a.nome==s) {return a.num;}} return 0; } public void inserisci(int s){ persone.addElement(new Abbonato(s,numero)); numero=numero+1; } Quando leggiamo dal Vector dobbiamo fare il cast (anche se sappiamo che contiene oggetti di tipo Abbonato, il compilatore non lo puo sapere). Il metodo addElement aggiunge in fondo al vettore (crea una nuova posizione) Per aggiungere un nuovo Abbonato dobbiamo fare new Abbonato() per creare il nuovo oggetto

public class Elencoext extends Elenco{ public Elencoext(){ } public void rimuovi(int s){ int j=0; while (j< persone.size()){ Abbonato a= (Abbonato) persone.elementAt(j); if (a.nome==s) {persone.removeElementAt(j);} else {j++;} } Sottoclasse Il metodo removeElementAt elimina una posizione (non lascia una posizione null)

Tester

Commenti La gestione di dati modificabili e notevolmente piu semplice rispetto agli arrays (automaticamente vengono aggiunte o tolte posizioni) Per contro bisogna fare attenzione ai sottotipi ed usare cast per risolvere i problemi del compilatore