Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Recupero debito quarto anno Primo incontro
Recupero debito quarto anno Secondo incontro
Informatica Recupero debito quarto anno Terzo incontro.
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.
Le gerarchie di tipi.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Semantica Operazionale di un frammento di Java: lo stato
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 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Derivazione tra classi
Overriding.
Approfondimento delle classi
Dichiarazione di classi Programmazione Corso di laurea in Informatica.
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.
Lab. Calc. 2005/06 Ereditarietà. Lab. Calc. 2005/06 Scopo di questa lezione: Imparare a creare nuove classi ereditando da classi già esistenti. Capire.
Java base IV: Java e la programmazione O.O.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Programmazione in Java (8)
AlgoLab - Ereditarieta' Ereditarietà e polimorfismo in Java Laboratorio di Algoritmi 02/03 Prof. Ugo de Liguoro.
I Metodi in Java Il termine "metodo" è sinonimo di "azione". Quindi, affinché un programma esegua qualche istruzione, deve contenere metodi.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
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: ________________________________________________________________________________.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Oggetti in C# Lezione 5 Polimorfismo I Andrea Zoccheddu.
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.
1 Osservazioni Generali Struttura di programma Gerarchia di classi: overloading, overriding, e dispatching Analisi ed esecuzione Modificabilità e condivisione.
Fondamenti di Informatica II Ingegneria Informatica Prof. M.T. PAZIENZA a.a – 3° ciclo.
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.
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.
estensione (con piccole varianti) di quella in
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in FONDAMENTI DI PROGRAMMAZIONE.
Esercitazione Object, Vettori, Liste. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo lo.
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 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini,
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini,
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.
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.
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.
Classi ed Oggetti in Java (Cenni). Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti.
Alcune Classi Standard Object, Vettori. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo.
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 del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
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.
Fondamenti di informatica T-A Esercitazione 3 : Classi, metodi, visibilità, metodi statici AA 2012/2013 Tutor : Domenico Di Carlo.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Corso di Algoritmi e Strutture Dati con Laboratorio A.A. 2015/16 Oltre le classi.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
Tecnologia OO.
Transcript della presentazione:

Programmazione in Java

Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi di dato, oggetti e operazioni (variabili e metodi d’istanza) Le due funzionalità possono coesistere all’interno di una stessa classe

Esempio Una classe che definisce una collezione di procedure 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} }

Ricordiamo che …… Variabili e metodi statici appartengono alla classe. Variabili e metodi di istanza appartengono agli oggetti (istanze della classe). Una classe definisce un tipo (nome della classe). Gli oggetti istanza della classe hanno quel tipo.

Nel contesto del paradigma di programmazione orientato ad oggetti, l'ereditarietà è un meccanismo fondamentale sia per il riutilizzo del codice che per lo sviluppo incrementale di programmi. Questo meccanismo permette infatti di estendere e potenziare classi già esistenti, e di fattorizzare informazioni comuni a più classi (meccanismo di astrazione come vedremo…..) Ereditarietà 1

In molti casi occorre definire una classe i cui oggetti hanno una struttura più ricca di quella di una classe già definita, oppure che realizza delle funzionalità aggiuntive. In questi casi si può definire la nuova classe come sottoclasse della precedente, ereditando le caratteristiche già presenti. La definizione di sottoclassi crea una gerarchia di classi (o di tipi) in cima alla quale c’è la classe Object. Ereditarietà 2

class Persona { String nome; String indirizzo; public Persona() {this.nome = ""; this.indirizzo = ""; } public Persona(String nome,String indirizzo) {this.nome = nome; this.indirizzo = indirizzo; } public String getNome() {return nome; } Esempio di classe 1

public String getIndirizzo() {return indirizzo; } public void visualizza() {System.out.println("Nome: " + nome + "\nIndirizzo: " + indirizzo); } public boolean omonimo(Persona p) {return this.nome.equals IgnoreCase(p.nome); } Esempio di classe 2

Vogliamo definire una classe Studente che rappresenti gli studenti iscritti ad un corso di laurea. Ogni studente è descritto dal nome, dall'indirizzo, dal numero di matricola e dal piano di studio. Uno Studente è un tipo particolare di Persona. L'ereditarietà ci consente di definire questa classe senza ripetere la descrizione di tutte le variabili e i metodi di Persona, ma in modo incrementale. Esempio di sottoclasse 1

class Studente extends Persona {int matricola; String pianoDiStudio; static int nextMatricola = 0; public Studente(String nome, String indirizzo) {this.nome = nome; this.indirizzo = indirizzo; this.matricola = nextMatricola ++; this.pianoDiStudio = ""; } Esempio di sottoclasse 2

public String getPdS() {return pianoDiStudio; } public void modificaPdS(String nuovoPdS) { pianoDiStudio += nuovoPdS + "\n"; } Esempio di sottoclasse 3

La parola chiave extends significa che Studente è una sottoclasse o classe derivata di Persona Persona è una superclasse o classe genitrice di Studente Un'istanza di Studente avrà quattro variabili di istanza: nome e indirizzo ereditate da Persona matricola e pianoDiStudio definite nella sottoclasse Studente Analogamente, su di essa possono essere invocati i metodi d’istanza della sottoclasse ed anche quelli della superclasse. Esempio di sottoclasse 4

Esempio di sottoclasse 5

Se c1 è una sottoclasse di (estende) c2 : variabili e metodi statici di c2 (e delle sue superclassi) sono visibili direttamente da c1; variabili e metodi di istanza di c2 (e delle sue superclassi) diventano anche variabili e metodi di istanza di c1 a meno di overriding. Semantica informale

Una sottoclasse può riscrivere un metodo della sottoclasse (stesso nome, stessi parametri, stesso tipo). In tal caso sugli oggetti della sottoclasse viene utilizzato il metodo riscritto (quello più specifico). Overriding 1

Ad esempio, se invochiamo il metodo visualizza su un'istanza di Studente, e verranno stampati solo i valori delle prime due variabili d'istanza (nome e indirizzo). Possiamo sovrascrivere (override) visualizza aggiungendo a Studente il seguente metodo: public void visualizza() {System.out.println("Nome: " + nome + "\nIndirizzo: " + indirizzo); System.out.println("Matricola: " + matricola + "\nPianodiStudio: " + pianoDiStudio); } Overriding 2

Il comando p.visualizza() invocherà il metodo visualizza della classe Persona se p è un'istanza di Persona, ma invocherà il nuovo metodo che stampa anche il numero di matricola e il piano di studio se p è un'istanza di Studente. Overriding 3

Anche per i costruttori esiste un meccanismo di ereditarietà: se c è una classe che ha come superclassi (nell’ordine) le classi c1, c2, …., cn, all’atto della creazione di una istanza di c si eseguono automaticamente i costruttori di cn, …, c2, c1, c (nell’ordine). Costruttori

Esempio public Studente() { this.matricola = nextMatricola ++; this.pianoDiStudio = ""; } Il costruttore di Persona viene invocato automaticamente per inizializzare le variabili eredidate. public Persona() {this.nome = ""; this.indirizzo = ""; }

Grazie all’ereditarietà i sottotipi supportono il comportamento del supertipo, ovvero le istanze della sottoclasse hanno le variabili d’istanza ed i metodi (al limite overridden) del supertipo hanno accesso alle variabili ed ai metodi statici della superclasse. Di conseguenza un oggetto del sottotipo può essere utilizzato dovunque sia richiesto un oggetto del supertipo. Principio di sostituzione

Un'istanza di Studente si può usare dovunque sia richiesto un oggetto di Persona, come in un assegnamento o nel passaggio di parametri. Persona tizio = new Studente("Mario Rossi", "Pisa"); /* corretto: su tizio posso invocare tutti i metodi di Persona, grazie all'ereditarieta' */ tizio.visualizza(); Studente pippo = new Studente("Pinco Pallino", "Empoli");... if(tizio.omonimo(pippo))... Esempio

Non è possibile il contrario, ovvero utilizzare un oggetto del supertipo al posto di uno del sottotipo. Il sottotipo puo’ avere variabili e metodi (d’istanza o statici) aggiuntivi.... Studente tizio = new Persona("Mario Rossi", "Pisa"); /* errore di tipo*/ Cautela

Tipo apparente : tipo con cui una variabile è dichiarata Tipo effettivo: tipo del valore a cui la variabile si riferisce Il tipo apparente ed il tipo effettivo possono essere diversi, in particolare il tipo effettivo può essere un sottotipo del tipo apparente Persona tizio = new Studente("Mario Rossi", "Pisa");... Conseguenza

Controllo dei tipi 1 Java è fortemente tipato ossia il compilatore di Java verifica che ogni assegnamento e ogni chiamata di metodo siano corretti riguardo al tipo. le relazioni di subtyping permettono che una entità abbia un tipo vero (tipo effettivo) diverso da quello apparente (apparent ) –tipo apparente noto a tempo di traduzione –tipo vero noto solo a tempo di esecuzione. il compilatore lavora solo col tipo apparente.

Esempio 1 int y = 7; int z = 3; int x = Num.gcd (z,y); Num.gcd si apetta due interi e restituisce un intero. Perciò la chiamata e l’assegnamento sono corretti in base al tipo con cui le variabili sono dichiarate (tipo apparente).

Persona tizio = new Studente("Mario Rossi", "Pisa"); tizio.modificaPdS("Algebra"); Si verifica un errore di compilazione. Infatti abbiamo chiamato su tizio (variabile dichiarata di classe Persona ) un metodo della sottoclasse Studente. Anche se il tipo effettivo sarebbe giusto ….. Esempio 2

In certe situazioni è utile/necessario invocare su di un identificatore un metodo di una sottoclasse. In questi casi può usare l'operazione di cast Persona tizio = new Studente("Mario Rossi", "Pisa"); ((Studente)tizio).modificaPdS("Algebra"); In questo caso non ci sono errori in fase di compilazione, il compilatore verifica solo che il tipo apparente di tizio sia sottotipo di Studente (tipo verso il quale facciamo il cast) e tratta nella chiamata di metodo tizio come se fosse del sottotipo. Casting 1

Quando si valuta ((Studente) tizio) se tizio non ha tipo effettivo Studente, verrà sollevata una eccezione a run-time Si può controllare la classe di appartenenza di un oggetto prima del cast: if (tizio instanceof Studente) ((Studente) tizio).modificaPdS("Algebra"); La condizione (obj instanceof Classe) restituisce true se e solo se obj è una istanza della classe Classe. Casting 2

Se nella classe Persona avessimo dichiarato le variabili d'istanza private, il metodo visualizza di Studente avrebbe causato un errore in compilazione, tentando di accedere a variabili private dichiarate nella superclasse. public void visualizza() {System.out.println("Nome: " + nome + "\nIndirizzo: " + indirizzo); System.out.println("Matricola: " + matricola + "\nPianodiStudio: " + pianoDiStudio); } Visibilità dei nomi

Allora come avrebbe fatto un oggetto di tipo Studente a modificare le variabili d’istanza ereditate dalla superclasse? Si puo’ accedere alle variabili attraverso i metodi della superclasse utilizzando super super fa riferimento all'istanza che sta eseguendo un metodo o un costruttore, ma costringe l'interprete a vedere l'oggetto come istanza della superclasse. Super 1

Riscriviamo il metodo visualizza per Studente in modo da chiamare il metodo visualizza di Persona per accedere alle variabili public void visualizza() { super.visualizza(); System.out.println("Matricola: " + matricola + "\nPianodiStudio: " + pianoDiStudio); } Super 2