Introduzione alle Classi e agli Oggetti in Java 1 Paradigmi di Programmazione Esistono diversi approcci alla programmazione, chiamati paradigmi di programmazione programmazione imperativa: un programma specifica le azioni che devono essere eseguite in sequenza per calcolare i risultati a partire dai dati ƒ programmazione funzionale: un programma è la definizione di una funzione, parametrica rispetto ai dati, che calcola i risultati ƒ programmazione logica: un programma è la descrizione delle proprietà che devono essere verificate dai risultati sulla base delle proprietà verificate dai dati programmazione object-oriented (OOP): si definiscono oggetti software in grado di interagire gli uni con gli altri attraverso lo scambio di messaggi 2 Programmazione Object Oriented La programmazione ad oggetti rappresenta un modo diverso di pensare alla risoluzione dei problemi: anziché modellare il problema adattandolo alla logica del calcolatore infatti, l’approccio orientato agli oggetti adatta il calcolatore al problema Il problema da risolvere viene analizzato individuando delle entità indipendenti che sono in relazione con le altre. Queste entità non vengono scelte perché facilmente traducibili nella logica di programmazione ma in quanto esistenti nel problema in esame e caratterizzate da vincoli che le isolano o le evidenziano dal contesto del problema stesso Le entità vengono rappresentate come oggetti del programma: lo scopo è di ottenere una corrispondenza biunivoca tra entità del problema e oggetti del programma. I progettisti possono quindi concentrarsi sui dati che stanno alla base del problema anziché sulle funzionalità del programma 3 Programmazione Object Oriented Problema Entità 1 Entità 2 Oggetto 1 Oggetto 2 … Entità n Oggetto n 4 Classi e Oggetti nella Realtà Le classi costituiscono un insieme di oggetti con le stesse proprietà e i medesimi comportamenti, tranne per i valori delle proprietà Esempio: La classe Auto è costituita da tutte le automobili: Classe Auto Oggetto Audi A4 5 Oggetto reale e Oggetto software Ciascun oggetto della realtà è: ƒ identificabile con un nome ƒ ha caratteristiche (proprietà) ben precise ƒ svolge funzioni specifiche ‰Un oggetto software non è quindi altro che: un’ adeguata rappresentazione virtuale, nel calcolatore, di un oggetto della realtà, sia esso concreto oppure astratto un costrutto che incapsula uno stato e un comportamento. Gli oggetti vi permettono di modellare il software in termini sia concretti che astratti. Più precisamente, un oggetto risulta essere l’istanza di una classe, un concetto che spiegheremo tra poco quindi in analogia al mondo reale, anche il software OO che può essere considerato un 6 Linguaggio Java I linguaggi di programmazione Object Oriented come Java forniscono astrazioni che consentono di rappresentare direttamente nel dominio della soluzione gli elementi che compaiono nel dominio del problema Il dominio è l’area di validità di un problema: l’insieme dei concetti che rappresentano gli aspetti importanti del problema che state cercando di risolvere Il paradigma di programmazione Object Oriented focalizza l’attenzione verso I dati. L’applicazione è suddivisa in un insieme di Oggetti in grado di interagire tra loro Un programma Java è essenzialmente un insieme di classi, non esistono funzioni definite (come in C) a livello esterno, né variabili globali esterne e anche il main è definito dentro a una classe 7 Oggetti Software Un oggetto software ha: ƒ un nome — che permette di referenziarlo con una identificazione univoca ƒ uno stato — un insieme di proprietà che lo caratterizzano ƒ un comportamento — un insieme di operazioni che sa eseguire • si può richiedere a un oggetto software di eseguire una operazione mediante l’invio di un messaggio • l’uso di un oggetto software è descritto dalla sua interfaccia 8 Cos’è una Classe? Una classe definisce gli attributi e i comportamenti che distinguono un oggetto di un certo tipo Gli attributi costituiscono le caratteristiche esteriori di una classe: per esempio, l’altezza e il colore dei capelli sono gli attributi di un uomo Un attributo di un oggetto può essere un collegamento diretto ad alcune sue variabili interne, oppure il valore restituito da un suo metodo Per comportamento si intende l’azione eseguita da un oggetto dopo aver passato un messaggio o in risposta al cambiamento di uno stato Un programma viene realizzato progettando e realizzando il codice sotto forma di classi ossia è Classe = dati (attributi o proprietà) + metodi costituito da oggetti software (istanze di classi) che interagiscono tra di loro 9 Classi in Java Una Classe è una collezione di Oggetti e metodi Una classe in Java definisce un insieme di oggetti con le stesse caratteristiche Il nome del file della Classe Java (.java) deve avere lo stesso nome della Classe Per esempio: la classe Studente: insieme degli oggetti Studente La classe Auto: insieme degli oggetti Auto La classe Telefono: insieme degli oggetti Telefono 10 Classi e Oggetti in Java Esclusi i tipi primitivi (boolean, char, byte, short, int, long, float, double), in Java esistono solo: • classi – componenti software che possono avere i loro dati e le loro funzioni – vengono usate come “struttura” per costruire oggetti • oggetti – entità dinamiche costruite al momento del bisogno secondo la definizione di una classe che ne descrive le proprietà 11 Oggetti e Metodi Gli Oggetti sono elementi di una classe con uguali caratteristiche Ogni Metodo è un insieme di istruzioni che una classe o un oggetto rendono disponibili ad altre classi e/o oggetti, affinché possa essere eseguito su richiesta Non occorre preoccuparsi della distruzione degli oggetti: Java ha un garbage Metodi: collector ‒ ‒ Esempio: oggetto Semaforo ‒ ‒ Accendi Spegni Diventa Verde ecc. Dati: ‒ ‒ ‒ ‒ Tecnologie Colori Anno Produzione ecc. 12 Come definire le Classi in Java Definire una classe in java equivale al creare un nuovo tipo di dato (una nuova classe di oggetti) Sintassi: class <nome_classe> { <definizioni di attributi> <costruttori> <definizioni di metodi> } La parentesi graffa aperta indica l’inizio del codice della classe Esempio: class Semaforo { ... } La parentesi graffa chiusa indica la fine del codice della classe 13 Classi: definizione degli attributi Gli attributi di una classe definiscono la struttura dello stato degli oggetti che vi appartengono Ogni attributo è definito usando la stessa sintassi usata per la definizione delle variabili locali Convenzioni: scrivere gli attributi in minuscolo (tecnologia e non Tecnologia) Sintassi: ogni attributo è definito usando la stessa sintassi usata per la definizione delle variabili locali <Tipo> nomeAttributo; Esempio: class Semaforo { String tecnologia; } 14 Classi: definizione dei Metodi I metodi di una classe definiscono il comportamento degli oggetti che vi appartengono Sintassi <tipoRitornato> <nomeMetodo> ([<listaPparametri>]) { <corpo_metodo> } String getTecnologia() { return tecnologia; } String è il tipo di dato che restituisce il metodo etodo void per i metodi che non ritornano alcun valore 15 Classi: il Costruttore Per la creazione degli oggetti si utilizza un metodo particolare che automatizza l’inizializzazione degli oggetti, il Costruttore. Il nome del costruttore deve coincidere con quello della classe In una stessa classe possono essere definiti più Costruttori ma con firme diverse (cioè i parametri formali devono differire nel tipo e/o nel numero). Se non viene specificato nemmeno un Costruttore, per default si ha quello senza argomenti. //Costruttore senza parametri public Semaforo() { ... } //Costruttore con un parametro public Semaforo(String tecnologieSemaforo) { tecnologia = tecnologieSemaforo; } 16 Dichiarazioni delle Classi La dichiarazione di classe introduce un nuovo tipo di dato (la classe stessa), i cui elementi saranno i suoi oggetti Nella classe vengono dichiarati: i costruttori, che determinano le modalità di creazione degli oggetti; le variabili o attributi di istanza, che costituiscono lo stato degli oggetti; i metodi di istanza, che realizzano le funzionalità degli oggetti. Quando un oggetto viene creato con new, gli viene associata una copia di ogni variabile di17 istanza Esempio: la Classe Contatore La classe descrive l’entità reale di un Contatore intero. Il valore iniziale del Contatore è zero ed è possibile incrementarlo di una unità tramite un metodo Attributi public class Contatore { private int valore; public String tecnologia; public void incrementa () { valore++; } Metodi metodo costruttore: ha lo stesso nome della classe. Usato per creare nuovi oggetti 18 Esempio: la Classe Contatore La classe descrive l’entità reale di un Contatore intero. Il valore iniziale del Contatore è zero ed è possibile incrementarlo di una unità tramite un metodo public class Contatore { private int valore; public String tecnologia; public void incrementa () { valore++; Attributi } public void reset() { valore=0; } public int getValore() { Metodi return valore=0; } public Contatore() { valore=0; } } 19 Creazione di Oggetti La creazione di un oggetto è un processo costituito dalle seguenti fasi: Allocare lo spazio di memoria necessario a contenere l'oggetto Inizializzare le variabili di istanza dell'oggetto Per contenere un oggetto la quantità di memoria necessaria è determinata soltanto dalla dichiarazione della classe (precisamente, dal numero e dal tipo delle variabili di istanza) Lo spazio necessario viene allocato in una zona di memoria chiamato heap. 20 Creazione di Oggetti Per creare un oggetto: prima si definisce un riferimento, il cui tipo è il nome della classe che fa da modello poi si crea dinamicamente l’oggetto tramite l’operatore new Una volta creato un oggetto si possono invocare i metodi che sono stati definiti nella classe di appartenenza Esempio: Contatore counter; // dichiarazione oggetto, riferimento counter = new Contatore(); // creazione oggetto – valore è zero 21 Creazione di Oggetti Per accedere ad un attributo di istanza di un oggetto, si usa la sintassi: <Oggetto>.<NomeAttributo> per invocare un metodo, si usa la sintassi <Oggetto>.<nomeMetodo>(<Parametri>) Contatore counter; // dichiarazione oggetto counter = new Contatore(); // creazione oggetto – valore è zero counter.tecnologia = “Metal - Led”; // accesso attributo tecnologia counter.incrementa(); // invocazione metodo – valore è 1 22 I Programmi in Java Essenzialmente un programma Java è un insieme di classi e oggetti Le classi sono componenti statici ed esistono già all’inizio dell’esecuzione del programma Gli oggetti sono componenti dinamici, e vengono creati dinamicamente al momento del bisogno Un semplice programma Java è costituito da una singola classe, quindi un singolo componente software E’ formata dalla sola parte statica in cui si definisce una singola funzione (statica): il main main è una funzione pubblica che non può avere valore di ritorno (è void), prende come argomento un array di String che possono essere anche non usati. Esempio: public static void main(String args[]) { ... } 23 Esempio di un Programma Il nostro esempio è costituito da due classi una di nome Test e definisce il main un’altra di nome Contatore che implementa il tipo Contatore (mostrata in precedenza) public class Test { public static void main(String args[]) { Contatore counter = new Contatore (); counter.incrementa(); //dichiarazione e creazione oggetto //invocazione metodo System.out.println(counter .getValue()); // System.out.println permette la stampa a video // in questo caso stampa il valore di counter } } 24 File Test.java