DAIS Univ. Ca' Foscari Venezia Programmazione ad oggetti Samuel Rota Bulò
Classi Una classe è un tipo strutturato. Gli oggetti sono istanze di classi. Una classe è composta da: ModalitàDiAccesso class NomeClasse //campi Variabili di istanza (campi) Costruttori Metodi Documentazione e commenti //costruttori //metodi Una classe ha associata una modalità di accesso (public o package se non si specifica la modalità) Classi con accesso public sono visibili ovunque, mentre classi con accesso package sono visibili solo ad altre classi dello stesso package.
Variabili di istanza Una classe contiene al proprio interno dei campi. Una variabile di istanza, o campo, ha associati: Tipo Nome Modalità di accesso (public, private, protected, package se non si specifica la modalità) I campi descrivono i dati che verranno manipolati dai metodi della classe. ModalitàDiAccesso class NomeClasse //campi ModalitàDiAccesso nomeditipo nomedivariabile; //costruttori //metodi
Variabili di istanza I campi con accesso private sono utilizzabili solo all'interno della classe. I campi con accesso public sono utilizzabili ovunque (anche esternamente alla classe) I campi con accesso protected verranno discussi più avanti I campi con accesso package sono utilizzabili solo dalle classi dello stesso package. È buona norma avere campi privati per garantire un buon incapsulamento dei dati. public class ClasseA public class ClasseB public static void main(string[] args) ClasseB obj=new ClasseB(); System.out.println(obj.j); //OK System.out.println(obj.i); //Errore! private int i; public int j;
Costruttori Una classe contiene al proprio interno uno o più costruttori. Il costruttore consente di creare un'istanza della classe (oggetto) e di inizializzarne i campi. Il costruttore ha lo stesso nome della classe e può avere parametri. Per ogni classe priva di costruttori esiste un costruttore di default senza parametri che inizializza i campi a valori di default (null per i riferimenti ad oggetto) ModalitàDiAccesso class NomeClasse //campi //costruttori ModalitàDiAccesso NomeClasse(tipoParametro nomeparametro,...) // implementazione costruttore //metodi
Costruttori public class Rectangle //campi di Rectangle private int x; private int y; private int width, height; //costruttori di Rectangle public Rectangle(int ax, int ay, int awidth, int aheight) x=ax; y=ay; width=awidth; height=aheight; public Rectangle(int awidth, int aheight) x=0; y=0; width=awidth; height=aheight; //metodi di Rectangle
Costruttori public class Rectangle //campi di Rectangle private int x; private int y; private int width, height; //costruttori di Rectangle Nota: il compilatore decide quale costruttore invocare sulla base del numero e dei tipi dei parametri considerandone anche l'ordine. Es: non posso coesistere Rectangle(int x, int y) Rectangle(int width,int height) public Rectangle(int x, int y, int width, int height) this.x = x; this.y = y; All'interno del costruttore esiste una this.width = width; variabile this che fa riferimento all'oggetto che si sta costruendo. this.height = height; this.width accede al campo width e non al parametro width public Rectangle(int width, int height) this(0,0,width,height); this può essere anche usata per chiamare un altro costruttore. In questo caso però deve //metodi di Rectangle comparire come prima istruzione
Metodi Una classe contiene metodi per manipolare i campi. Un metodo può avere modalità di accesso public, private, protected o package. Un metodo ammette zero o più parametri Un metodo ammette un valore di ritorno o nessuno se void è il tipo di ritorno. Nei metodi esiste il parametro implicito this che consente di avere a disposizione il riferimento dell'oggetto su cui il metodo viene invocato. ModalitàDiAccesso class NomeClasse //campi //costruttori //metodi ModAccesso tipodiritorno nomemetodo(tipoparametro nomeparametro,...) // implementazione metodo
Metodi public class Rectangle //campi di Rectangle private int x,y; private int width, height; //costruttori di Rectangle //metodi di Rectangle public int getx() return x; public void setx(int x) this.x = x; public void translate(int dx, int dy) x+=dx; //x=x+dx; y+=dy; //y=y+dy; Nota: all'interno di un metodo possiamo invocare altri metodi della stessa classe. Questi verranno automaticamente applicati all'oggetto puntato da this. Per es in translate avremmo potuto anche scrivere: x=getx()+dx;
Documentazione (Javadoc) È buona consuetudine fornire la documentazione di Classi Metodi con relativi parametri e valore di ritorno Costruttori con relativi parametri La documentazione di campi e metodi privati non è essenziale in quanto non accessibili dall'esterno. Con Javadoc possiamo utilizzare frammenti di codice HTML. Esistono tag speciali di Javadoc
Documentazione di classi * Un <em>rettangolo</em> identifica in uno piano un'area di * lunghezza width e altezza height il cui angolo in alto a * sinistra si trova alle coordinate (x,y). * * @author Samuel Rota Bulò public class Rectangle //campi //costruttori //metodi
Documentazione costruttori * Costruisce un rettangolo di lunghezza width, altezza * height con angolo in alto a sinistra posizionato in (x,y). * * @param x coordinata x del punto in alto a sinistra * @param y coordinata y del punto in alto a sinistra * @param width lunghezza * @param height altezza public Rectangle(int x, int y, int width, int height)...
Documentazione metodi * Ritorna la coordinata x del punto in alto a sinistra * * @return coordinata x del punto in alto a sinistra public int getx()... * Imposta la coordinata x del punto in alto a sinistra * * @param x nuova coordinata x del punto in alto a sinistra public void setx(int x)...
Documentazione dei campi * Coordinata x del punto in alto a sinistra public int x; * Coordinata y del punto in alto a sinistra public int y; * Larghezza del rettangolo public int width; * Altezza del rettangolo public int height; Nota: i campi sono tipicamente ad accesso privato e in quanto tali non vanno necessariamente commentati al fine di produrre la documentazione. Vanno invece commentati i campi pubblici/protected. In generale, commenti non finalizzati alla documentazione sono utili per il programmatore che dovrà modificare la classe in futuro. Nota: in Rectangle i campi sono pubblici per ragioni di performance, ma in assenza di buone ragioni vanno tenuti privati.