Introduzione agli oggetti Raffaella Brighi, a.a. 2005/06 Corso di Algoritmi e programmazione. A.A. 2005-06 CdL Operatore Informatico Giuridico. L’astrazione L’assembler e i linguaggi imperativi (fortran, basic, c) sono astrazioni rispetto al linguaggio macchina ma costringono a pensare ancora in termini di struttura del computer (spazio delle soluzioni) anziché di struttura del problema (spazio dei problemi). L’approccio OO (object oriented) consente di descrivere il problema nei suoi propri termini. Il programmatore può rappresentare elementi nello spazio dei problemi. Il programma si adatta al gergo del problema. Gli oggetti sono elementi nello spazio dei problemi che hanno una rappresentazione nello spazio delle soluzioni. Ogni oggetto assomiglia ad un piccolo computer: ha uno stato e possiede operazioni che gli si può chiedere di eseguire. 1 Ogni cosa è un oggetto. Un oggetto è una variabile particolare che memorizza dati ma a cui possiamo anche fare richieste di operazioni su se stesso. Qualunque componente concettuale del problema può essere un oggetto. Un programma è un insieme di oggetti che si dicono l’un l’altro cosa fare inviandosi messaggi. Per fare una richiesta ad un oggetto gli si manda un messaggio. Ogni oggetto ha la sua memoria formata da altri oggetti. Ogni oggetto ha un tipo. problemi complessi possono essere rappresentati in modo semplice Ciascun oggetto è un’istanza di una classe. Tutti gli oggetti di un determinato tipo possono ricevere gli stessi messaggi. Siccome un oggetto di tipo “cerchio” è anche un oggetto di tipo “forma geometrica”, un cerchio può accettare anche tutti i messaggi delle forme geometriche. Un oggetto possiede un stato, un comportamento ed un’identità. 2 Oggetti e classi La classe definisce il tipo dell’oggetto, vale a dire caratteristiche (proprietà, campi=dati) e comportamenti (funzionalità, metodi) che ogni oggetto deve avere. Ciascun oggetto è l’istanza di una classe. Conto corrente di Mario Rossi Saldo: 20.000 euro Conto corrente Conto corrente di Luca Bianchi Saldo: 10.000 euro CLASSE OGGETTI saldo ed intestatario sono proprietà comuni a tutti gli oggetti della classe, ogni oggetto a un suo stato Classi e oggetti Una classe è solo il modello di un oggetto e quindi non riserva spazio in memoria per i suoi dati. Indica quali campi e quali metodi ciascun oggetto creato sulla base di quella classe deve avere. Ciascun oggetto è caratterizzato da: campi (variabili, proprietà) e metodi. I valori delle variabili definiscono lo stato dell’oggetto, i metodi il suo comportamento. Ogni oggetto quando viene istanziato occupa spazio di memoria per le variabili. 3 Esempio di istanza ( = oggetti) cc : ContoCorrente intestatario = mario rossi saldo = 20000 miaLampada: Lampada Un oggetto ha un’interfaccia Le richieste che possono essere fatte ad un oggetto sono definite dalla sua interfaccia. Il tipo (la classe) indica l’interfaccia degli oggetti. Il modo migliore di pensare agli oggetti è come fornitore di servizi. 4 Esempi di interfaccia ContoCorrente -intestatario -saldo +visualizzaMovimenti() +apri() +chiudi() Lampada Classe ContoCorrente Campi: intestatario e saldo Metodi: visualizzaMovimenti(), apri(), chiudi() Classe Lampada +accendi() +spegni() +soffusa() Metodi: accendi(), spegni(), soffusa() L’implementazione L’interfaccia dice solo quali richieste gli oggetti di una classe mettono a disposizione. Dentro ad ogni classe ci sono blocchi di codice che indicano quali azioni devono essere eseguite per soddisfare ogni richiesta. Esistono sempre due punti di vista: la creazione della classe e l’utilizzo della classe. Alcune classi fondamentali sono predefinite e incluse nelle librerie Java (es. System.out, String, Date…) 5 Ereditarietà e polimorfismo Vi sono due importanti proprietà del OO che danno grande flessibilità ai programmi Ereditarietà : consente di riusare le interfaccia, clonando le classi basi e modificandole. Polimorfismo: rende gli oggetti intercambiabili. Le vedremo piu’ avanti. Ogni cosa è un oggetto In Java ogni cosa è un oggetto ad eccezione dei tipi di dato primitivi (int, boolean, ecc.). Un programma Java stesso è un oggetto: helloworld è una classe con un metodo particolare “main”. In ogni programma Java è introdotta automaticamente una libreria di classi Java.lang con cui possiamo gia’ fare semplici operazioni. 6 Hello World! public class helloworld { public static void main(String[] args) { // TODO code application logic here System.out.println("Ciao mondo!!"); } } Diagramma delle classi e degli oggetti del programma HelloWorld HelloWorld «uses» +Main() : HelloWorld System.out +println() println() : System.out 7 Esempio di creazione di un programma (linea di comando) Creare un file con lo stesso nome della classe ed estensione .java ->helloworld.java Compilare: istruzione javac nomefile.java (il compilatore crea il file .class) Esecuzione: istruzione java nomefile Creazione, durata ed uso di un oggetto Un oggetto, per poter essere utilizzato, deve essere creato, sia esso istanza di una classe di libreria piuttosto che istanza di classi da noi definite. Per creare un oggetto occorre definire un riferimento ad esso (= dire che un nuovo oggetto di quel tipo deve essere creato - dichiarazione) e inizializzarlo (= dire come deve essere creato). Come l’oggetto deve essere inizializzato (cioe’ quali siano i valori necessari) è indicato dal costruttore della classe. 8 Esempi di dichiarazione e creazione di oggetti Cerchio c; c= new Cerchio (10); oppure Cerchio c = new Cerchio (10) String parola = new String (“casa”) Date datadinascita=new Date(01/01/1980) L’operatore new L’operatore new crea l’oggetto (crea l’istanza della classe) chiamando il costruttore della classe (è simile alla chiamata di un metodo della classe). 9 Gli oggetti si manipolano con i riferimenti c, parola, datadinascita non sono in realta’ oggetti ma riferimenti ad oggetti. Il rapporto che c’è tra un riferimento e l’oggetto è analogo al rapporto telecomando/TV. Manipoliamo il riferimento per modificare l’oggetto. Utilizzare gli oggetti Ogni oggetto è caratterizzato da campi e metodi (definiti nella classe) I campi sono elementi dati, proprietà. Ad ogni campo corrisponde un tipo. Possono essere tipi di dato primitivi (es. numeri, il raggio del cerchio) oppure riferimenti ad altri oggetti. I metodi sono funzioni, cioe’ richieste di operazioni che possiamo fare all’oggetto. I metodi possono ricevere dei parametri (argomenti) e restituire dei valori una volta terminata l’esecuzione. 10 Utilizzo di campi e metodi Campi RiferimentoOggetto.campo c.raggio = 10 Assegna il valore 10 al campo raggio dell’oggetto collegato al riferimento c Metodi RiferimentoOggetto.nomeMetodo(argomenti) c.disegna; Disegna l’oggetto collegato al riferimento c area=c.calcolaArea(); il metodo calcola l’area di c e la restituisce in output. Metodi statici (o metodi di classe) Alcuni metodi possono essere invocati direttamente richiamando la classe senza istanziarla. Tali metodi hanno nella definizione del metodo la parola chiave static Es. System.out 11 Librerie di classi e package Una libreria di classi è una collezione di classi che possono essere utilizzate nello sviluppo di un programma Con qualsiasi ambiente di sviluppo viene distribuita la libreria standard di Java. Si possono poi aggiungere altre librerie free o commerciali. System e String ad esempio appartengono alla libreria standard. Una libreria è formata da gruppi di classi tra loro collegati, denominate API (Application Programmer Interface) - java Database API. Le classi di una libreria possono essere raggruppate in package, a seconda delle loro funzioni Librerie di classi e package Alcuni package della libreria standard java.lang: supporto generico. Importato automaticamente in ogni programma. Java.applet: crea programmi (applet) trasportabili attraverso la rete Java.util: utilità generali Java.io: funzioni di input/output Java.net: serve per comunicare attraverso la rete Java.sql: interagisce con le basi di dati 12 La clausola import Per utilizzare classi di un package occorre specificare il nome della classe assieme al nome del package a cui appartiene oppure specificare la clausola import. import java.util.Random; importa la classe Random del package java.util import java.util.*; importa tutte le classe del package java.util Classe String In Java le stringhe di caratteri sono oggetti della classe String che appartiene alla libreria Java.lang La classe String include metodi per esaminare singoli caratteri della sequenza, per confrontare stringhe, per cercare stringhe, per estrarre sottostringhe, per creare copie della stringha con trasformazioni in maiusc o minusc, per concatenare stringhe. Una volta che un oggetto di tipo String è stato creato è IMMUTABILE. Esistono numerosi metodi però che restituiscono un nuovo oggetto di tipo String, risultato di modifiche fatte al valore originario della stringa. 13 Metodi della classe String String (String str) Costruttutore: crea un nuovo oggetto di tipo stringa aventi gli stessi caratteri di str String nome; (dichiarazione) String nome = new String (“oggi piove”); char charAt (int index) Restituisce un dato di tipo carattere corrispondente al carattere all’indice specificato char mycar; mycar = nome.charAt (1) int compareTo (String str) Restituisce un dato di tipo intero che indica se la stringa precede (torna un valore negativo), è uguale (torna zero) o segue (torna un valore positivo) la stringa str nell’ordinamento lessicografico. int mynum; String nome2 = new String (“domani sara bel tempo”); mynum= nome.compareTo (nome2) Metodi della classe String String concat(String str) Restituisce una nuova stringa che è il risultato del concatenamento della stringa precedente con il valore di str. boolean equals (String str) boolean equalsIgnoreCase (String str) Restituisce true se la stringa contiene gli stessi caratteri di str, false altrimenti. Il primo considera anche maius e minuscole, il secondo no. int length () Restituisce il numero di caratteri della stringa String replace (char OldChar, char newChar) Restituisce una nuova stringa identica a quella attuale eccetto per il fatto che ogni occorrenza di oldChar è sostituita da newChar. 14 Metodi della classe String String substring(int offset, int endIndex) Restituisce una nuova stringa che è un sottoinsieme di quella attuale partendo dalla posizione offset fino al carattere endIndex -1. String toLowerCase() String toUpperCase() Restituisce una nuova stringa identica a quella attuale tranne per il fatto che tutte le lettere maiuscole sono convertite in minuscole. String toUpperCase() Restituisce una nuova stringa identica a quella attuale tranne per il fatto che tutte le lettere minuscolo sono convertite in maiuscole. L’operatore di concatenazione di stringhe + Una stringa di caratteri delimitata da doppi apici non può essere divisa su due linee di codice. L’operatore di concatenazione (+) consente di sommare le due stringhe Anche un valore numerico può essere concatenato ad una stringa L’operatore + si comporta diversamente se agisce tra numeri o tra stringhe. 15 Sequenza di escape Java definisce la sequenze di escape per rappresentare caratteri speciali all’interno di stringhe (esempio il doppio apice). \t : Carattere di tabulazione \n : nuova linea \r : ritorno di carrello \” : doppi apici \’ : singolo apice \\ : barra inversa 16