Introduzione. Java. Esempio. Esempio
|
|
|
- Oreste Pasini
- 9 anni fa
- Просмотров:
Транскрипт
1 Java polimorfismo G. Prencipe Introduzione È un altro degli ingredienti fondamentali della OOP Permette di organizzare il codice e la leggibilità e di ottenere programmi estensibili Viene detto anche dynamic binding Partiamo da un esempio public class Note { private String notename; private Note(String notename) { this.notename = notename; public String tostring() { return notename; public static final Note // Costanti MIDDLE_C = new Note("Middle C"), C_SHARP = new Note("C Sharp"), B_FLAT = new Note("B Flat"); // Non si possono creare oggetti addizionali perché il costruttore è private public class Instrument { System.out.println("Instrument.play() " + n); ///:~ 1
2 // Oggetti Wind sono Instruments // perché hanno la stessa interfaqccia public class Wind extends Instrument { // Ridefinisce l interfaccia System.out.println("Wind.play() " + n); ///:~ public class Music { public static void tune(instrument i) { i.play(note.middle_c); public static void main(string[] args) { Wind flute = new Wind(); tune(flute); // Upcasting: il metodo tune accetta un // Instrument, ma noi gli passiamo un Wind ///:~ Dimenticare il tipo Dimenticare il tipo Nell esempio visto, sembra quasi che ci dimentichiamo del tipo di un oggetto Non sarebbe più normale se semplicemente tune() accettasse direttamente un riferimento a un Wind (piuttosto che a un Instrument)? Domanda: cosa accadrebbe? Perché non vogliamo fare così? Nell esempio visto, sembra quasi che ci dimentichiamo del tipo di un oggetto Non sarebbe più normale se semplicemente tune() accettasse direttamente un riferimento a un Wind (piuttosto che a un Instrument)? Domanda: cosa accadrebbe? Semplice: bisognerebbe scrivere un metodo tune() per ogni tipo di Instrument nel sistema!! 2
3 class Stringed extends Instrument { System.out.println("Stringed.play() " + n); class Brass extends Instrument { System.out.println("Brass.play() " + n); public class Music2 { public static void tune(wind i) { i.play(note.middle_c); public static void tune(stringed i) { i.play(note.middle_c); public static void tune(brass i) { i.play(note.middle_c); public static void main(string[] args) { Wind flute = new Wind(); Stringed violin = new Stringed(); Brass frenchhorn = new Brass(); tune(flute); // No upcasting tune(violin); tune(frenchhorn); ///:~ Polimorfismo Chiaramente funziona, ma Bisogna scrivere metodi specifici per ogni Intrument aggiunto Inoltre il compilatore non ci avverte se dimentichiamo di aggiungere un metodo per una delle sottoclassi!! Con il polimorfismo possiamo scrivere un unico metodo che prende la superclasse come argomento, e funziona per ognuna delle sottoclassi!! Binding Il processo di collegare una chiamata a un metodo al corpo del metodo è detto binding Quando il binding è effettuato prima che il programma venga eseguito, viene detto early binding Con il polimorfismo, il compilatore non può sapere su quale Instrument verrà invocato il metodo tune() In questo caso si ha late binding Il binding avviene a run-time Tutti i metodi in Java usano late binding, a meno che un metodo non sia dichiarato final 3
4 Classi e metodi astratti Una classe astratta è una classe che viene definita solo per stabilire una interfaccia comune per tutte le sue sottoclassi Non viene fornita l implementazione completa per quella classe Si definisce solo l interfaccia o parte dell implementazione Classi e metodi astratti Quindi non ha senso creare oggetti di una classe astratta E infatti non si possono creare oggetti di una classe astratta, altrimenti il compilatore si lamenta All interno della classe astratta è possibile definire metodi senza darne una implementazione Essi sono detti metodi astratti Classi e metodi astratti La loro sintassi è abstract void f() Se una classe contiene uno o più metodi astratti, anch essa deve essere qualificata come abstract Classi e metodi astratti Se si scrive una sottoclasse della classe astratta e se ne vogliono creare oggetti, si devono fornire implementazioni dei metodi astratti della superclasse Altrimenti, anche la sottoclasse diviene astratta In questo caso il compilatore forza l inserimento della parola chiave abstract 4
5 Classi e metodi astratti È possibile creare una classe astratta senza inserire metodi astratti È utile se vogliamo comunque evitare la creazione di oggetti di quella classe Vediamo un esempio abstract class Instrument { private int i; public abstract void play(note n); public String what() { return "Instrument"; public abstract void adjust(); class Wind extends Instrument { System.out.println("Wind.play() " + n); public String what() { return "Wind"; public void adjust() { class Percussion extends Instrument { System.out.println("Percussion.play() " + n); public String what() { return "Percussion"; public void adjust() { public class Music4 { static void tune(instrument i) { i.play(note.middle_c); static void tuneall(instrument[] e) { for(int i = 0; i < e.length; i++) tune(e[i]); public static void main(string[] args) { // Upcasting durante la creazione dell array Instrument[] orchestra = {new Wind(), new Percussion(), new Stringed(), new Brass(), new Woodwind() ; tuneall(orchestra); 5
6 Classi astratte Costruttori e polimorfismo Si nota che comunque le classi astratte, essendo sottoclassi di Object, ereditano i tutti i suoi metodi Quindi ogni classe astratta fruisce sicuramente di un certo numero di metodi non astratti Analizziamo l esempio Sandwich.java e il suo output L ordine con cui vengono invocati i costruttori è il seguente 1. Il costruttore della superclasse è invocato. Questo passo è ripetuto ricorsivamente in modo che prima il costruttore della radice della gerarchia è invocato e poi gli altri (a discendere) 2. I membri della classe sono inizializzati secondo l ordine della dichiarazione 3. Il corpo del costruttore della sottoclasse è invocato Costruttori e polimorfismo L ordine con cui sono invocati i costruttori è importante Infatti, al momento della creazione di un oggetto di una sottoclasse, si deve assumere che tutti i membri della superclasse devono essere correttamente inizializzati L unico modo per garantire questo è di invocare prima il costruttore della superclasse Anche per questo motivo, è buona pratica inizializzare i membri oggetto quando sono dichiarati (come per b, c, e i nell esempio Sandwich.java) Costruttori e polimorfismo Cosa accade se invochiamo all interno di un costruttore un metodo? Sappiamo che in Java abbiamo dynamic binding Non sempre si hanno i risultati voluti, ed è facile introdurre comportamenti non controllati (derivati appunto dal binding dinamico) Vediamo un esempio: PolyConstructors.java 6
7 Domanda: cosa notiamo di strano nel risultato? In particolare nel risultato della prima invocazione di draw()? Domanda: cosa notiamo di strano nel risultato? In particolare nel risultato della prima invocazione di draw()? Il valore di radius è 0 (nemmeno 1, che è il valore di inizializzazione in RoundGlyph) Perché? Rivediamo l ordine di inizializzazione per i costruttori. Costruttori e polimorfismo 1. La memoria allocata per l oggetto viene inizializzata a zero (binario) prima che qualsiasi altra cosa accada 2. I costruttori per la superclasse sono invocati, come detto in precedenza 1. A questo punto il metodo overridden draw() viene invocato (prima che il costruttore per RoundGlyph sia chiamato!!)-->radius è 0 3. I membri sono inizializzati nell ordine della dichiarazione 4. Il corpo del costruttore della sottoclasse è eseguito Costruttori e polimorfismo Quindi, una buona pratica nella scrittura dei costruttori è di fare il minimo indispensabile per portare l oggetto in uno stato buono Se possibile, evitare di invocare metodi Gli unici metodi sicuri che si possono invocare sono quelli final (o private, che sono automaticamente final) della superclasse Su di essi, infatti, non è possibile fare overriding 7
8 Regola di design Non è sempre facile capire se è meglio utilizzare composizione o ereditarietà per il riutilizzo del codice Una regola di massima è la seguente: Utilizzare ereditarietà per esprimere differenze di comportamento, e membri (quindi composizione) per esprimere variazioni di stato Un esempio può chiarire: Transmogrify.java Ereditarietà ed estensione Quando creiamo una sottoclasse di una data superclasse, l interfaccia viene ereditata Se non aggiungiamo nuovi metodi alla sottoclasse, l interfaccia della sottoclasse è esattamente la stessa di quella della superclasse In questo caso si parla di ereditarietà pura Ereditarietà ed estensione Ereditarietà ed estensione Con l ereditarietà pura, tra superclasse è sottoclasse si stabilisce una relazione del tipo èun : Cerchio è una FormaGeom Se invece nella sottoclasse introduciamo nuovi metodi, allora stiamo estendendo l interfaccia Si stabilisce una relazione del tipo è-come Infatti, la sottoclasse ha tutti i metodi disponibili per la superclasse, ma ha qualcosa in più Con l ereditarietà pura non ci sono problemi, visto che il polimorfismo si occupa di tutto È possibile invocare metodi indifferentemente su oggetti della superclasse o della sottoclasse Si ha upcasting Con l estensione, i metodi aggiunti alla sottoclasse non possono essere invocati su oggetti della superclasse 8
9 Ereditarietà ed estensione Ereditarietà ed estensione Nel caso di estensione, il problema è che se facciamo upcast su un oggetto della sottoclasse non possiamo più invocare su di esso i metodi estesi (della sottoclasse) Ma noi sappiamo che quell oggetto è un oggetto della sottoclasse Quindi, come facciamo a riscoprire il tipo esatto di quell oggetto? Con il downcast In Java ogni cast è controllato Quindi, se i tipi (conseguenti a un cast) non tornano, otteniamo un errore ClassCastException a run-time Il controllo dei tipi a run-time è detto run-time type identification (RTTI) Vediamo un esempio: RTTI.java Esercizi Esercizi 1. Creare una gerarchia di classi Roditori: Topo, Castori, Coniglio, ecc. 1. Definire la superclasse abstract. Nella superclasse fornire metodi (abstract dove possibile) comuni a tutti i Roditori 2. Fare override di questi metodi nelle sottoclassi con comportamenti diversi a seconda del tipo di Roditore 3. Creare un array di Roditori, e invocare i metodi della superclasse e controllare cosa accade 2. Creare una classe astratta TestAstratto con nessun metodo 1. Creare una sottoclasse SottoTA con un metodo metodouno() 2. Creare un metodo statico metododue() che prende un riferimento alla superclasse, fa il downcast alla sottoclasse, e chiama metodouno() 3. Nel main dimostrare che il tutto funziona 4. Inserire una dichiarazione astratta del metodouno() nella superclasse per eliminare la necessità del downcast 9
10 Java polimorfismo fine 10
La classe java.lang.object
La classe java.lang.object In Java: Gerarchia di ereditarietà semplice Ogni classe ha una sola super-classe Se non viene definita esplicitamente una super-classe, il compilatore usa la classe predefinita
Esempio 2: Subtyping
Esempio 2: Subtyping 22 Subclassing e subtyping Fino ad ora abbiamo trattato l ereditarietà come strumento che consente il riuso flessibile di classi già esistenti mediante l aggiunta o la ridefinizione
Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo
Esempi al calcolatore su: 1) 2) Subtyping e polimorfismo 1 Esempio 1: 2 Introduzione Java prevede due automatismi legati ai costruttori: Se una classe non ha costruttori viene creato automaticamente il
Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali
Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali 1 Ereditarietà, polimorfismo e altri sporchi trucchi Facciamo un esempio che ci permette di comprendere come vengono utilizzate
Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali
Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali 1 Ereditarietà, polimorfismo e altri sporchi trucchi Facciamo un esempio che ci permette di comprendere come vengono utilizzate
Programmazione orientata agli oggetti Classi astratte e interfacce
Programmazione orientata agli oggetti Classi astratte e interfacce Fondamenti di Informatica L-B 1 Classi astratte Java ci consente di definire classi in cui uno o più metodi non sono implementati, ma
Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali
Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali 1 Ereditarietà, polimorfismo e altri sporchi trucchi Facciamo un esempio che ci permette di comprendere come vengono utilizzate
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I) Ing. Gianluca Caminiti Sommario ( OOP ) Programmazione Object-Oriented Incapsulamento, Ereditarietà, Polimorfismo Richiami
Proprietà delle Classi e degli Oggetti in Java
Fondamenti di Informatica Proprietà delle Classi e degli Oggetti in Java Fondamenti di Informatica - D. Talia - UNICAL 1 Proprietà object-oriented di Java Definendo le caratteristiche e le operazioni di
Programmazione Java Struttura di una classe, Costruttore, Riferimento this
Programmazione Java Struttura di una classe, Costruttore, Riferimento this [email protected] http://www.di.univaq.it/romina.eramo/tlp Roadmap > Struttura di una classe > Costruttore > Riferimento
Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 11 luglio 2014 TEMPO DISPONIBILE: 2 ore Negli esercizi
Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe [email protected]. È qualcosa che abbiamo già visto varie volte
Java riutilizzo delle classi G. Prencipe [email protected] Introduzione Una delle caratteristiche fondamentali in Java è il riutilizzo del codice Ci sono due modi per ottenerlo Creare oggetti di classi
Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi:
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 22 settembre 2014 TEMPO DISPONIBILE: 2 ore Negli
Gerarchia di classi Java 1
Costruttori della sottoclasse Gerarchia di classi Java Parte 2 Corso di laurea in Comunicazione digitale I costruttori non vengono ereditati, non essendo membri di classe Vengono definiti esplicitamente
18 - Classi parzialmente definite: Classi Astratte e Interfacce
18 - Classi parzialmente definite: Classi Astratte e Interfacce Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/
Fondamenti di Informatica T-1. Ereditarietà & Polimorfismo
Ereditarietà & Polimorfismo Ereditarietà Meccanismo per definire una nuova classe (classe derivata) come specializzazione di un altra (classe base) La classe base modella un concetto generico La classe
Programmazione ad oggetti
Programmazione ad oggetti OOP La programmazione orientata agli oggetti (Object Oriented Programming) ha l obiettivo di formalizzare gli oggetti del mondo reale e di costruire con questi un mondo virtuale.
In questa lezione. Polimorfismo
In questa lezione Polimorfismo (in Java) Tipo statico e tipo dinamico dei reference Binding dinamico (late binding) Casting (Upcasting e Downcasting) Operatore instanceof Polimorfismo con Object Polimorfismo
Polimorfismo parametrico vs polimorfismo per inclusione
Polimorfismo parametrico vs polimorfismo per inclusione Esercizio Definire il tipo di dato Stack con operazioni Push( element ) Pop() Non forzare una specifica implementazione Non forzare un tipo specifico
Riassunto. La programmazione OO. Oggi. Esempio
Riassunto La programmazione OO Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/mizzaro/ [email protected] Programmazione, lezione 17 29 novembre
Programmazione a Oggetti Lezione 10. Ereditarieta
Programmazione a Oggetti Lezione 10 Ereditarieta Sommario Come definire sottoclassi Costruttori Abstract Classes Final Ereditarietà: promemoria Strumento tipico dell OOP per riusare il codice e creare
Ereditarietà e Polimorfismo
Ereditarietà e Polimorfismo Riusare il software A volte si incontrano classi con funzionalità simili In quanto sottendono concetti semanticamente vicini È possibile creare classi disgiunte replicando le
14 - Metodi e Costruttori
14 - Metodi e Costruttori Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it
Il Linguaggio Java. Le interfacce
Il Linguaggio Java Le interfacce Ordinamento dei conti PROBLEMA: si vogliono ordinare i libretti di risparmio (SavingsAccount) in base al loro tasso di interesse REQUISITO: La classe dovrebbe essere ordinabile,
Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà
L ereditarietà è il meccanismo attraverso cui viene implementata la relazione di specializzazione (is-a). L ereditarietà è il meccanismo attraverso cui una classe (derivata) eredita da un altra classe
Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013
Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013 Sommario Variabili statiche Ereditarietà multipla Le interfacce Binding Esercizi Variabili statiche Se una variabile di una classe ha il
Laboratorio di programmazione
Laboratorio di programmazione Lezione VIII Tatiana Zolo [email protected] 1 PROGRAMMAZIONE A OGGETTI Quando si programma a oggetti si scompone il problema in sottogruppi di parti collegate che tengono
Fondamenti di Informatica T-1. Classi e metodi astratti
Classi e metodi astratti 2 Classi astratte L'ereditarietà è utile per rappresentare tassonomie e gerarchie di entità reali. Non sempre però tutti i livelli della gerarchia rappresentano entità concrete.
Uso di metodi statici. Walter Didimo
Uso di metodi statici Walter Didimo Metodi di istanza Fino ad ora abbiamo imparato a creare oggetti e ad invocare metodi su tali oggetti i metodi venivano eseguiti dagli oggetti un metodo invocato su un
Fondamenti di Informatica T-1. Costruttori Ereditarietà
Costruttori Ereditarietà 2 Costruttori Si occupano della creazione e dell'allocazione in memoria degli oggetti. public class Persona{ //Variabili di istanza private String nome; private String cognome;
Definizione di metodi in Java
Definizione di metodi in Java Un metodo in Java definisce un operazione ad alto livello (sottoprogramma) che consente di manipolare dati e oggetti. Durante la computazione effettuata da un programma, un
Esempio su strutture dati dinamiche: ArrayList
Esempio su strutture dati dinamiche: ArrayList Fondamenti di Informatica L-B 1 ArrayList Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito
Programmazione con Java
Programmazione con Java Classi e istanze in Java Definizione di classe in Java A meno che non si usino classi già scritte da altri, prima di poter creare un qualsiasi oggetto devo creare la sua rappresentazione:
Modulo 2: Strutture fondamentali della programmazione Java
Modulo 2: Strutture fondamentali della programmazione Java Argomenti Trattati: Un semplice programma Java: Presentazione di un primo Esempio; Introduzione alla struttura; Compilazione ed esecuzione. Argomenti
19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso
Funzioni, Stack e Visibilità delle Variabili in C
Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7
OO puro. Primi concetti di Java. Tipi primitivi. Ogni cosa è un oggetto. Java è object-oriented puro Non come il C+ + (OO ibrido) Lorenzo Bettini
Primi concetti di Java Lorenzo Bettini OO puro Java è object-oriented puro Non come il C+ + (OO ibrido) Per compatibilità col C Ogni cosa è un oggetto Gli oggetti si manipolano tramite riferimenti String
6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
6 - Blocchi e cicli Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it
Ingegneria del Software
Ingegneria del Software Analisi Object Oriented ed Elementi di Programmazione OO Origini Le metodologie ad oggi nascono negli anni 70 ma si affermano solo nelgi anni 80 grazie alla nascita dei linguaggi
Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java
programmi sorgente: files.java compilatore Indipendenza di java dalla macchina ospite Programmi java Programmi java Programmi java files.class bytecode linker/loader bytecode bytecode Java API files.class
Linguaggi di programmazione II AA 2010/2011 Esercitazione 2
Linguaggi di programmazione II AA 2010/2011 Esercitazione 2 1) Scrivere l'output del seguente programma Java public class Bean private String str; Bean(String str ) this.str = str; public String tostring()
Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013
Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013 Sommario Paradigma O.O. Oggetti e Classi Ereditarietà Paradigma Object-Oriented Il paradigma O.O. si ispira all ambiente che ci circonda,
Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro
Laboratorio di Programmazione Lezione 2 Cristian Del Fabbro Prossima lezione GIOVEDÌ 29 OTTOBRE 14:00 Input da tastiera package input; import java.io.*; public class Input { public static void main(string[]
Lezione 6. Visibilità degli identificatori e tempo di vita degli oggetti
Lezione 6 Visibilità degli identificatori e tempo di vita degli oggetti Programmazione I Paolo Valente - 2009/2010 Ripasso dichiarazioni oggetti Finora abbiamo scritto le dichiarazioni di variabili e costanti
Laboratorio di Programmazione Lezione 4. Cristian Del Fabbro
Laboratorio di Programmazione Lezione 4 Cristian Del Fabbro Prossima lezione Mercoledì 25 novembre ore 8:30-11:00 Classe Una classe descrive degli oggetti tramite: Proprietà/variabili/campi (dati/caratteristiche,
TIPI PRIMITIVI: LIMITI
TIPI PRIMITIVI: LIMITI I tipi primitivi sono i "mattoni elementari" del linguaggio In varie situazioni può però essere necessario trattare i tipi primitivi come oggetti quando una funzione pretende come
18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
18 - Vettori Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it Corso di
Android lezione 9 Le listview
Android lezione 9 Le listview In questa lezione introduciamo le ListView. Una listview ci permette di mostrare una serie di elementi all interno di una lista che puo anche essere scrollata. Ecco un esempio
Perché il linguaggio C?
Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare
