Introduzione all Object Orientation

Documenti analoghi
Programmazione Orientata agli Oggetti in Linguaggio Java

Capitolo 7. Un occhiata più attenta a metodi e classi

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Oggetti. La programmazione orientata agli oggetti, OOP (Object-Oriented Programming), prende il nome dall elemento su cui si basa, l oggetto.

14 - Metodi e Costruttori

Programmazione I - corso B a.a prof. Viviana Bono

Dichiarazione di una classe. Dichiarazione ereditarietà

Classi ed Oggetti. Fondamenti di Informatica A-K

Programmazione con Java

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Concetti Base Encapsulation ed Ereditarietà Programmare con l Ereditarietà. Java: Ereditarietà. Damiano Macedonio

Programmazione Orientata agli Oggetti in Linguaggio Java

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Confrontare valori 1

Metodi statici. Dichiarazione e chiamata di metodi statici

Array. Definizione e utilizzo di vettori

Programmazione Orientata agli Oggetti in Linguaggio Java

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Programmazione ad oggetti

Programmazione Orientata agli Oggetti in Linguaggio Java

Fondamenti di Programmazione Prof.ssa Elisa Tiezzi. Programmazione orientata a oggetti

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Proprietà delle Classi e degli Oggetti in Java

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

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Proprietà delle Classi e degli Oggetti in Java

Ereditarietà. Unità 9. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Modello procedurale versus modello O-O

Paradigmi della PO. Incapsulamento. Ereditarietà. Polimorfismo. Software per TLC - AA 2008/2009 1

Uso di classi e oggetti. Prof. Francesco Acarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Primo esempio di un programma Java

Java: Definire Classi e Creare Oggetti

Metodi statci. Dichiarazione e chiamata di metodi statci

L oggetto creato. Creazione di Oggetti. Rectangle: il concetto 10. Costruzione. Lo spazio di memoria del linguaggio Java. Rectangle: l oggetto

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

Programmazione. Cognome... Nome... Matricola... Prova scritta del 20 febbraio 2012

Uguaglianza e copia di oggetti

Gerarchia di classi Java 1

Fondamenti di Informatica

Programmazione Orientata agli Oggetti in Linguaggio Java

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Fondamenti di informatica T-1 (A K) Esercitazione 9: array

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

ESERCIZI JAVA. Esercizi sulle Interfacce. Esercizio 1:

METODI in Java. Prof.Angela Bonifati. Metodi e Sottoprogrammi

La classe java.lang.object

Laboratorio di Sistemi Polimorfismo Java. Prerequisiti: per la comprensione dell'articolo è necessario conoscere il concetto di Ereditarietà in Java.

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Fondamenti di Java. Soluzione esercizio hashcode

Definizione di classi. Walter Didimo

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

Array. Walter Didimo

Gerarchia di classi Java 1

Programmazione Orientata agli Oggetti in Linguaggio Java

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

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

Ereditarietà: concetti di base

Esempio su strutture dati dinamiche: ArrayList

Fondamenti di informatica T-1 (A K) Esercitazione 8: classi e oggetti

PROGRAMMAZIONE 2 4. Java: un modello operazionale

L Array e un oggetto. L array puo contenere elementi che sono: tipi primitivi, o oggetti (in realta riferimenti ad oggetti!!!).

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

unità di compilazione

Variabili e Metodi di classe Interfacce e Package File in Java

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

Programmazione M.A. Alberti. Comunicazione digitale AA 2009/ Classi in Java 1. Le classi in Java. Oggetti. Classi. Classi. Visibilità dei dati

Esonero del corso di Programmazione a Oggetti

Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

Corso sul linguaggio Java

Oggetti e dati primitivi 1

16 - Ereditarietà, tipi e gerarchie

16 - Ereditarietà, tipi e gerarchie

Programmazione Orientata agli Oggetti in Linguaggio Java

17 - Ereditarietà, tipi e gerarchie

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Corso sul linguaggio Java

Corso di Laurea in Ingegneria Informatica. Corso di Reti di Calcolatori A.A. 2009/2010

Java Gli array. Array

Usare e costruire oggetti. Concetti Fondamentali. Interfaccia Pubblica di una. Application Program Interface

Do...While() Break Continue Concetto di Funzione e Procedura METODI in Java

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

Programmazione ad oggetti

Introduzione alla Programmazione in Java attraverso un esempio commentato

Fondamenti di informatica T-1 (A K) Esercitazione 7: metodi, classi, oggetti

Transcript:

Introduzione all Object Orientation Introduzione all object orientation Il java è un linguaggio orientato agli oggetti. La classe è il costrutto logico su cui si basano i linguaggi orientati agli oggetti perché definisce la forma e la natura di un oggetto. Qualunque concetto si desideri implementare in un programma java, deve essere incapsulato in una classe. Le classi create fino ad ora esistevano semplicemente per incapsulare il metodo main. La classe definisce un nuovo tipo di dati, che successivamente può essere utilizzato per creare oggetti di quel tipo. La classe è un modello di un oggetto L oggetto è una istanza di una classe 1

Introduzione alle classi Forma generale di una classe: class nomeclasse tipo variabile-istanza1; tipo variabile-istanza2; tipo variabile-istanzan; tipo nomemetodo1(elenco parametri) //corpo del metodo tipo nomemetodon(elenco parametri) //corpo del metodo Le variabili (variabili di istanza) ed i metodi definiti all interno di un istruzione class sono definiti membri della classe. Ogni istanza di una classe contiene una propria copia delle variabili di istanza! Introduzione alle classi Una classe semplice: class Box double width; double height; double depth; Una dichiarazione class crea solo un modello, non un vero e proprio oggetto! Per creare realmente un oggetto Box, occorre utilizzare l istruzione: Box mybox = new Box(); mybox = 2

Introduzione alle classi Per accedere alle variabili membro si utilizza l operatore punto (.) mybox.width = 100; = 100 mybox = L operatore punto viene usato sia per accedere alle variabili di istanza sia per accedere ai metodi all interno di un oggetto. Introduzione alle classi class Box double width; double height; double depth; class BoxDemo Box mybox=new Box(); double vol; mybox.width=10; mybox.height=20; mybox.depth=15; vol = mybox.width*mybox.height*mybox.depth; System.out.println("volume is " + vol); Attenzione: una classe deve stare in un file.java omonimo 3

Introduzione alle classi class Box double width; double height; double depth; class BoxDemo Box mybox1=new Box(); Box mybox2=new Box(); double vol; mybox1.width=10; mybox1.height=20; mybox1.depth=15; mybox2.width=3; mybox2.height=6; mybox2.depth=9; vol=mybox1.width*mybox1.height*mybox1.depth; System.out.println("volume is " + vol); vol=mybox2.width*mybox2.height*mybox2.depth; System.out.println("volume is " + vol); Introduzione alle classi L istruzione seguente: Box mybox = new Box(); è la composizione delle seguenti due fasi: Box mybox; mybox = new Box(); //Dichiarazione del riferimento all oggetto //Allocazione di un oggetto di tipo Box (in fase di esecuzione) Istruzione Effetto Box mybox; null mybox mybox = new Box(); Una classe è un costrutto logico, mentre un oggetto è una realtà fisica. mybox Width Height Depth Oggetto Box 4

Introduzione alle classi Le istruzioni seguenti: hanno il seguente effetto: Box b1 = new Box(); Box b2 = b1; b1 Width Height Depth Oggetto Box b2 Qualunque modifica apportata all oggetto mediante b2 influirà sull oggetto a cui fa riferimento b1, poiché sono lo stesso oggetto. Introduzione alle classi I metodi class Box double width; double height; double depth; void volume() //non restituisce alcun valore accetta zero parametri System.out.print("Volume is "); System.out.println(width*height*depth); class BoxDemo3 Box mybox1=new Box(); Box mybox2=new Box(); mybox1.width=10; mybox1.height=20; mybox1.depth=15; mybox2.width=3; mybox2.height=6; mybox2.depth=9; mybox1.volume(); mybox2.volume(); 5

Introduzione alle classi I metodi class Box double width; double height; double depth; double volume() //restituisce un valore accetta zero parametri return width*height*depth; class BoxDemo4 Box mybox1=new Box(); Box mybox2=new Box(); double vol; mybox1.width=10; mybox1.height=20; mybox1.depth=15; mybox2.width=3; mybox2.height=6; mybox2.depth=9; vol = mybox1.volume(); System.out.println("Volume is " + vol); vol=mybox2.volume(); System.out.println("Volume is " + vol); Introduzione alle classi I metodi class Box double width; double height; double depth; double volume() return width*height*depth; void setdim(double w, double h, double d) //metodo con parametri width=w; height=h; depth=d; class BoxDemo5 Box mybox1=new Box(); Box mybox2=new Box(); double vol; mybox1.setdim(10,20,15); mybox2.setdim(3,6,9); vol=mybox1.volume(); System.out.println("Volume is " + vol); vol=mybox2.volume(); System.out.println("Volume is " + vol); 6

Introduzione alle classi I costruttori Un costruttore inizializza un oggetto immediatamente dopo che è stato creato. Ha lo stesso nome della classe in cui si trova ed è sintatticamente simile ad un metodo. Dopo essere stato definito, il costruttore viene chiamato immediatamente dopo la creazione dell oggetto, prima che l operatore new agisca. I costruttori non hanno alcun tipo di ritorno. Introduzione alle classi I costruttori class Box double width; double height; double depth; Box() //costruttore senza parametri System.out.println("Constructing Box"); width=10; height=10; depth=10; double volume() return width*height*depth; class BoxDemo6 Box mybox1=new Box(); Box mybox2=new Box(); double vol; vol=mybox1.volume(); System.out.println("Volume is " + vol); vol=mybox2.volume(); System.out.println("Volume is " + vol); 7

Introduzione alle classi I costruttori class Box double width; double height; double depth; Box(double w, double h, double d) //costruttore con parametri width=w; height=h; depth=d; double volume() return width*height*depth; class BoxDemo7 Box mybox1=new Box(10,20,15); Box mybox2=new Box(3,6,9); double vol; vol=mybox1.volume(); System.out.println("Volume is " + vol); vol=mybox2.volume(); System.out.println("Volume is " + vol); Le 3 parole chiave dell object orientation Programmazione orientata al processo: Codice che agisce sui dati Programmazione ad oggetti: Programma costruito sulla base dei dati e di una serie di interfacce ben definite su questi dati I tre principi base della programmazione ad oggetti: Incapsulamento Meccanismo tramite il quale è possibile controllare rigidamente l accesso al codice e ai dati della classe attraverso un intefaccia ben definita. L accesso ai dati è possibile a prescindere dai dettagli implementativi. Ereditarietà Meccanismo tramite il quale un oggetto acquisisce le propietà di un altro. Classificazione gerarchica. L ereditarietà interagisce con l incapsulamento: se una data classe incapsula alcuni attributi, allora qualsiasi sottoclasse comprenderà gli stessi attributi più tutti quelli aggiuntivi dipendenti dalla sua specializzazione. animale labrador da riporto domesticus golden canino barboncino mammifero Polimorfismo Meccanismo tramite il quale un interfaccia può essere utilizzata per un insieme generale di azioni (una interfaccia, più metodi). lupus felino rettile 8

Esempio: Una classe stack //Questa classe definisce uno stack di interi contenente 10 valori class Stack int stck[] = new int[10]; int tos; Stack() tos = -1; void push(int item) if(tos==9) System.out.println("Stack is full."); else stck[++tos] = item; int pop() if(tos<0) else System.out.println("Stack underflow."); return 0; return stck[tos--]; Esempio: Una classe stack class TestStack Stack mystack1=new Stack(); Stack mystack2=new Stack(); for(int i=0;i<10;i++) mystack1.push(i); for(int i=10;i<20;i++) mystack2.push(i); System.out.println("Stack in mystack1:"); for(int i=0;i<10;i++) System.out.println(mystack1.pop()); System.out.println("Stack in mystack2:"); for(int i=10;i<20;i++) System.out.println(mystack2.pop()); //INCAPSULAMENTO: queste istruzioni non dovrebbero essere legali! mystack1.tos = -2; mystack2.stck[3] = 100; 9

Esempio: Una classe stack //Stack: seconda versione class Stack private int stck[] = new int[10]; private int tos; Stack() tos = -1; void push(int item) if(tos==9) System.out.println("Stack is full."); else stck[++tos] = item; int pop() if(tos<0) else System.out.println("Stack underflow."); return 0; return stck[tos--]; Esempio: Una classe stack class TestStack Stack mystack1=new Stack(); Stack mystack2=new Stack(); for(int i=0;i<10;i++) mystack1.push(i); for(int i=10;i<20;i++) mystack2.push(i); System.out.println("Stack in mystack1:"); for(int i=0;i<10;i++) System.out.println(mystack1.pop()); System.out.println("Stack in mystack2:"); for(int i=10;i<20;i++) System.out.println(mystack2.pop()); //INCAPSULAMENTO: queste istruzioni non sono legali! mystack1.tos = -2; mystack2.stck[3] = 100; 10

Polimorfismo class OverloadDemo void test() System.out.println("No parameters"); void test(int a) System.out.println("a: " + a); void test(int a, int b) System.out.println("a and b: " + a + " " + b); double test(double a) System.out.println("double a: " + a); return a*a; I metodi sovraccarichi devono distinguersi per tipo e/o numero di parametri Attenzione! Il tipo di ritorno non è sufficiente a differenziare due versioni di un metodo. Polimorfismo class Overload OverloadDemo ob = new OverloadDemo(); double result; ob.test(); ob.test(10); ob.test(10,20); result = ob.test(123.2); System.out.println("Result of ob.test(123.2): " + result); 11

Polimorfismo class OverloadDemo void test() System.out.println("No parameters"); void test(int a, int b) System.out.println("a and b: " + a + " " + b); void test(double a) System.out.println("Inside test(double) a: " + a); Cosa accadrebbe se richiamassimo il metodo test con un parametro intero? Polimorfismo class Overload_bis OverloadDemo ob = new OverloadDemo(); int i=88; ob.test(); ob.test(10,20); ob.test(i); //test() viene richiamato con un parametro intero ob.test(123.2); 12

Polimorfismo nei costruttori class Box double width; double height; double depth; Box(double w, double h, double d) width = w; height = h; depth = d; Box() width = -1; height = -1; depth = -1; Box(double len) width = height = depth = len; double volume() return width*height*depth; Polimorfismo nei costruttori class OverloadCons Box mybox1=new Box(10,20,15); Box mybox2=new Box(); Box mycube=new Box(7); double vol; vol=mybox1.volume(); System.out.println("Volume of mybox1 is " + vol); vol=mybox2.volume(); System.out.println("Volume of mybox2 is " + vol); vol=mycube.volume(); System.out.println("Volume of mycube is " + vol); 13

Riferimenti Dati in un programma Java: Dati dei tipi primitivi Riferimenti Riferimenti Dati che servono per manipolare gli oggetti Fungono da intermediari rispetto all oggetto e consentono di accedere I campi dati dell oggetto e di invocarne I metodi Riferimenti Dichiarazione di un riferimento Tipo del riferimento e identificatore Tipo del riferimento Nome di una classe Java I riferimenti sono tipati Valore per un riferimento Identificatore di un oggetto della classe corrispondente 14

Riferimenti Esempio: Box b1; Calcolatrice c; java.io.bufferedreader br; Semantica della dichiarazione: Assegna alla variabile di tipo riferimento uno spazio nella memoria che può contenere l identificatore di un oggetto della classe corrispondente Attenzione Il riferimento e l oggetto a cui si riferisce sono due dati completamente diversi che corrispondono a zone di memoria diverse Riferimenti Modificatori: public, protected, private Determinano la visibilita del riferimento static Rappresentano attributi/funzionalità intrinseche alla classe stessa, e non sono associati ad un particolare oggetto. Una variabile deve essere di istanza se, concettualmente, il suo valore può essere diverso per oggetti diversi Una variabile dovrebbe essere statica se il suo valore non cambia da un oggetto all'altro Se un metodo accede ad una variabile d'istanza, non può essere statico Se un metodo non accede ad alcuna variabile d'istanza, dovrebbe essere statico final Determina l impossibiloita di ridefinire un metodo Usato per definire costanti in java 15

Riferimenti Operazioni possibili su un riferimento: Assegnazione Uso dell oggetto a cui si riferisce (con il. ) Passaggio dei parametri Assegnazione Con un costruttore Con il valore di un altro riferimento Con il valore speciale null Riferimenti Esempio: Box b1 = new Box(); Box b2; b2 = b1; // i due riferim. puntano allo stesso oggetto b1.volume(); // uso del. b1 = null; // assegnamento del valore nullo Una annotazione importante Il riferimento funge da intermediario per l oggetto solo quando si utilizza il punto. In tutti gli altri casi si lavora con il valore del riferimento Esempio un pezzo di codice che, date due circonferenze, verifica se hanno gli stessi valori (centro e raggio) 16

Confronti Una prima soluzione (errata): Circonferenza c1 = new Circonferenza (1, 1, 2); Circonferenza c2 = new Circonferenza (1, 1, 2); if (c1 == c2) System.out.println( Circonferenze di valore uguale ); Una seconda soluzione: Circonferenza c1 = new Circonferenza (1, 1, 2); Circonferenza c2 = new Circonferenza (1, 1, 2); if (c1.getascissacentro() == c2.getascissacentro() && c1.getordcentro() == c2.getordinatacentro() && c1.getraggio() == c2.getraggio()) System.out.println ( Circonferenze uguali ); Confronti Di conseguenza: attenzione ai confronti tra oggetti Due tipi di confronti: confronti tra i riferimenti (confrontano gli id. degli oggetti puntati): servono a verificare se due rif. puntano allo stesso oggetto confronti tra i valori degli oggetti: servono a verificare se oggetti diversi hanno gli stessi valori per le proprietà 17

Confronti Un altro esempio: uguaglianza di stringhe. Verificare se due nomi sono uguali a Paolo String nome1 = new String ( Paolo ); String nome2 = new String ( Paolo ); if (nome1 == nome2 && nome1 == Paolo ) System.out.println( Si chiamano entrambi Paolo ); Soluzione errata: stiamo confrontando di nuovo I riferimenti public boolean equals ( Object o ); Confronti La versione corretta: String nome1 = new String ( Paolo ); String nome2 = new String ( Paolo ); if (nome1.equals(nome2) && nome1.equals( Paolo )) System.out.println( Si chiamano entrambi Paolo ); Implementazione di un metodo equals: public boolean equals ( Object o ) If ( (o instanceof Box) && (this.width == ((Box)o).width) && (this.height == ((Box)o).height) && (this.depth == ((Box)o).depth) ) ) return true; else return false; 18

Riferimento this Il Riferimento this : Riferimento di un oggetto a sè stesso Non ha senso nei metodi statici E particolare perchè si riferisce, a seconda del contesto, ad oggetti diversi Regola generale: Nel codice del metodo, il valore del riferimento this variadachiamataa chiamata. Ogni volta ha il valore del riferimento utilizzato per effettuare la chiamata del metodo Viene anche detto parametro implicito del metodo Passaggio dei parametri Per cominciare: parametri e argomenti in Java possono essere di due tipi (come le variabili): ditipodibase di tipo riferimento In sintesi: Java prevede esclusivamente il passaggio per valore per cui non è possibile, in un metodo, modificare il valore di un argomento attraverso un parametro Ma: Java prevede i riferimenti, e con i riferimenti nei metodi si possono modificare gli oggetti 19

Passaggio dei parametri Distinguiamo 2 tipologie di parametri: Passaggio dei parametri dei tipi di base: nel caso di valori dei tipi di base il passaggio avviene sempre per valore quindi non è possibile in alcun modo modificare il valore di un argomento di un tipo di base attraverso un parametro in un metodo Passaggio dei riferimenti: anche i riferimenti vengono passati ai metodi per valore (copia del valore dell argomento nello spazio di memoria del parametro) ðma, siccome il metodo riceve una copia del riferimento all oggetto, attraverso il riferimento può usare l oggetto e quindi modificarne lo stato si ottiene l effetto del passaggio per riferimento Passaggio dei parametri public void somma(double a, double b) this.risultato = a + b; public static void main(string[ ] args) double x, y; x = 20; y = 10; Calcolatrice c = new Calcolatrice(); c.somma(x, y); 20

Passaggio dei parametri public void somma(double a, double b) this.risultato = a + b; a++; public static void main(string[ ] args) double x, y; x = 20; y = 10; Calcolatrice c = new Calcolatrice(); c.somma(x, y); System.out.println(x); // stampa 20 Passaggio Parametri public class parametri int x = 1; double d[] = new double[2]; d[0] = 25; metodo(d,x); System.out.println("Il valore di d[0] = " + d[0]); System.out.println("Il valore di x = " + x); static void metodo(double s[],inti) s[0] = 100; i = 18; 21