Capitolo 4 Classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Preparazione La scena finora ha riguardato esperienze e materiali di base Sistemi informatici e soluzione dei problemi Variabili Tipi Input e output Espressioni Assegnazioni Oggetti Classi e metodi standard Pronti per quanto riguarda realmente Java Progettare e implementare oggetti che rappresentano informazioni e oggetti del mondo fisico Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Programmazione orientata agli oggetti Base Creare e manipolare oggetti con attributi e comportamenti che il programmatore può specificare Meccanismo Classi Vantaggi Un tipo di informazione viene progettato e implementato una volta Riutilizzato come necessario Non servono nuove analisi o giustificazioni della rappresentazione Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl La prima classe - ColoredRectangle Scopo Rappresenta un rettangolo colorato in una finestra Introduce le nozioni fondamentali della progettazione e dell'implementazione di oggetti Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Nozioni di base JFrame Classe Java principale per rappresentazione una finestra grafica con titolo e bordo. Considerare JFrame w1 = new JFrame("Bigger"); JFrame w2 = new JFrame("Smaller"); w1.setSize(200, 125); w2.setSize(150, 100); w1.setVisible(true); w2.setVisible(true); Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Nozioni di base Considerare JFrame w1 = new JFrame("Bigger"); JFrame w2 = new JFrame("Smaller"); w1.setSize(200, 125); w2.setSize(150, 100); w1.setVisible(true); w2.setVisible(true); 200 pixels 150 pixels 125 pixels 100 pixels Java – Guida alla programmazione - James Cohoon, Jack Davidson Classe ColoredRectangle - versione iniziale Copyright © 2004 - The McGraw-Hill Companies srl Scopo Supportare la visualizzazione della finestra quadrata contenente un rettangolo blu La finestra ha una lunghezza del lato pari a 200 pixel Il rettangolo è largo 40 pixel e alto 20 L'angolo superiore sinistro del rettangolo si trova a (80, 90) Le limitazioni sono temporanee Ricordare che BMI.java precedeva BMICalculator.java Molti concetti da introdurre Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredRectangle in azione Considerare ColoredRectangle r1 = new ColoredRectangle(); ColoredRectangle r2 = new ColoredRectangle(); System.out.println("Enter when ready"); System.in.read(); r1.paint(); // disegna la finestra associata a r1 r2.paint(); // disegna la finestra associata a r2 Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredRectangle in azione Considerare ColoredRectangle r1 = new ColoredRectangle(); ColoredRectangle r2 = new ColoredRectangle(); System.out.println("Enter when ready"); System.in.read(); r1.paint(); // disegna la finestra associata a r1 r2.paint(); // disegna la finestra associata a r2 Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredRectangle in azione Considerare ColoredRectangle r1 = new ColoredRectangle(); ColoredRectangle r2 = new ColoredRectangle(); System.out.println("Enter when ready"); System.in.read(); r1.paint(); // disegna la finestra associata a r1 r2.paint(); // disegna la finestra associata a r2 Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredRectangle in azione Considerare ColoredRectangle r1 = new ColoredRectangle(); ColoredRectangle r2 = new ColoredRectangle(); System.out.println("Enter when ready"); System.in.read(); r1.paint(); // disegna la finestra associata a r1 r2.paint(); // disegna la finestra associata a r2 All'oggetto angle ColoredRectangle a cui viene inviato un ColoredRect object referenced byfa r1riferimento is being sent r1 a message messaggio r1.paint() r2.paint() Il messaggio devono essere The messages indica inst ructche t hei due objectoggetti s t o display t hemselves visualizzati All'oggetto angle ColoredRectangle a cui inviato un ColoredRect object referenced byfa r2riferimento is being sentr2a viene message messaggio Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Struttura di ColoredRectangle.java import javax.swing.*; import java.awt.*; public class ColoredRectangle { // variabili istanza per attributi dell'oggetto private int width; private int height; private JFrame window; private int x; private int y; private Color color; // ColoredRectangle(): costruttore predefinito public ColoredRectangle() { // configura gli attributi } // paint(): mostra il rettangolo nella sua finestra public void paint() { // Rappresenta il disegno } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Variabili istanza e attributi Campo dati Termine Java per l'attributo di un oggetto Variabile istanza Nome simbolico per un campo dati Solitamente dispone di accesso privato Assiste nel celamento delle informazioni incapsulando gli attributi dell'oggetto Inizializzazione predefinita Variabili istanza numeriche inizializzate a 0 Variabili istanza logiche inizializzate su false Variabili istanza oggetto inizializzate a null public class ColoredRectangle { // variabili istanza per attributi dell'oggetto private int width; private int height; private JFrame window; private int x; private int y; private Color color; // ColoredRectangle(): costruttore predefinito public ColoredRectangle() { window = new JFrame("Box Fun"); window.setSize(200, 200); width = 40; x = 80; height = 20; y = 90; color = Color.BLUE; window.setVisible(true); } // paint(): mostra il rettangolo nella sua finestra public void paint() { Graphics g = window.getGraphics(); g.setColor(color); g.fillRect(x, y, width, height); } } public class ColoredRectangle { // variabili istanza per contenere attributi dell'oggetto private int width; private int height; private JFrame window; private int x; private int y; private Color color; // ColoredRectangle(): costruttore predefinito public ColoredRectangle() { window = new JFrame("Box Fun"); window.setSize(200, 200); width = 40; x = 80; height = 20; y = 90; color = Color.BLUE; window.setVisible(true); } // paint(): mostra il rettangolo nella sua finestra public void paint() { Graphics g = window.getGraphics(); g.setColor(color); g.fillRect(x, y, width, height); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Costruttore predefinito di ColoredRectangle Copyright © 2004 - The McGraw-Hill Companies srl public class ColoredRectangle { // instance variables to describe object attributes ... // ColoredRectangle(): default constructor public ColoredRectangle() { ... } ... } The namedel of acostruttore const ruct or always mat chesat he Il nome è sempre uguale quello della of classe name it s class costruttore non not riporta di trestituzione. AUn const ruct or does list ituns tipo ret urn ype. A constUn ruct or costruttore restituisce sempre un riferimento un nuovo always ret urns a reference t o a new object of it sa class oggetto della sua classe public class ColoredRectangle { // variabili istanza per contenere attributi dell'oggetto private int width; private int height; private JFrame window; private int x; private int y; private Color color; // ColoredRectangle(): costruttore predefinito public ColoredRectangle() { window = new JFrame("Box Fun"); window.setSize(200, 200); width = 40; x = 80; height = 20; y = 90; color = Color.BLUE; window.setVisible(true); } // paint(): mostra il rettangolo nella sua finestra public void paint() { Graphics g = window.getGraphics(); g.setColor(color); g.fillRect(x, y, width, height); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Costanti di colore Color.BLACK Color.BLUE Color.CYAN Color.DARK_GRAY Color.GRAY Color.GREEN Color.LIGHT_GRAY Color.MAGENTA Color.ORANGE Color.PINK Color.RED Color.WHITE Color.YELLOW r ColoredRectangle r = new ColoredRectangle(); ColorRectangle The value a Il valore di of una ColoredRect variabileangle variable is a è ColoredRectangle un riferimento reference t oaaun oggetto angle ColoredRect ColoredRectangle object - width = 40 height = 20 x = 80 y = 90 window = color = + paint() : void + brighter() : Color + ... - text = "Box Fun" - ... + length() : int + ... Color - color = - ... String JFrame - width = 200 height = 200 title = ... + setVisible(boolean status) : void + ... public class ColoredRectangle { // variabili istanza per attributi dell'oggetto private int width; private int height; private JFrame window; private int x; private int y; private Color color; // ColoredRectangle(): costruttore predefinito public ColoredRectangle() { window = new JFrame("Box Fun"); window.setSize(200, 200); width = 40; x = 80; height = 20; y = 90; color = Color.BLUE; window.setVisible(true); } // paint(): mostra il rettangolo nella sua finestra public void paint() { Graphics g = window.getGraphics(); g.setColor(color); g.fillRect(x, y, width, height); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Contesto grafico Grafica Definita in java.awt.Graphics Rappresenta le informazioni per una richiesta di rendering Colore Componente Tipo di carattere … Fornisce metodi Disegno di testo Disegno di linee Disegno di forme Rettangoli Ovali Poligoni Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Sistema di coordinate Java X-Axis Coordinat e (0.0) Y-Axis Coordinat e (80, 90) Coordinat e (120, 110) public class ColoredRectangle { // variabili istanza per attributi dell'oggetto private int width; private int height; private JFrame window; private int x; private int y; private Color color; // ColoredRectangle(): costruttore predefinito public ColoredRectangle() { window = new JFrame("Box Fun"); window.setSize(200, 200); width = 40; x = 80; height = 20; y = 90; color = Color.BLUE; window.setVisible(true); } // paint(): mostra il rettangolo nella sua finestra public void paint() { Graphics g = window.getGraphics(); g.setColor(color); g.fillRect(x, y, width, height); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Invocazione dei metodi Considerare r1.paint(); a r1 r2.paint(); a r2 // visualizza la finestra associata // visualizza la finestra associata Osservare Quando viene eseguito un metodo istanza, il sistema accede e manipola gli attributi dell'oggetto associati all'invocazione È importante manipolato comprendere quale oggetto viene Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Invocazione dei metodi public class ColoredRectangle { // instance variables to describe object attributes ... // paint(): display the rectangle in its window public void paint() { window.setVisible(true); Graphics g = window.getGraphics(); g.setColor(color); Inst ance variable window window references La variabile d'istanza fa g.fillRect(x, y, width, height); triferimento he JFrame atall'attributo t ribut e of t heJFrame object } dell'oggetto haion. causato t hat caused t he che invocat That is, ... l'invocazione. t he invocat ionOssia, r1.paintl'invocazione () causes t he di r1.paint() consente window at t ribut e of t hel'accesso Coloredall'attributo window dell'oggetto } Rect angle referenced by r1t o be I valori queste variabili Thedi values of t hese inst ance ColoredRectangle cui faion accessed. Similarly, t heainvocat d'istanza sono gli stessi riferimento r1. Analogamente, variables are also from t he r2.paint () causes t he window dell'oggetto ColoredRectangle l'invocazione di r2.paint() consente ColoredRect angle object t hat at t ribut e of t he ColoredRect angle che ha invocato il metodo l'accesso all'attributo window invoked met hod paint (). referenced by r2 t o be accessed. paint() dell'oggetto ColoredRectangle a cui fa riferimento r2 Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Perfezionamento di ColoredRectangle Analisi Un oggetto ColoredRectangle dovrebbe Essere in grado di avere un colore Essere posizionabile ovunque nella sua finestra Non presentare limitazioni su larghezza e altezza Attributi accessibili Attributi aggiornabili Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Perfezionamento di ColoredRectangle Costruzioni e comportamenti aggiuntivi Costruzione specifica Costruire la rappresentazione di un rettangolo utilizzando i valori forniti per i suoi attributi Funzioni di accesso Fornire i valori degli attributi Singoli metodi per fornire larghezza, altezza, coordinata x, coordinata y, colore o finestra del rettangolo associato Funzioni di modifica Gestire le richieste per la modifica degli attributi Garantire che gli oggetti abbiano sempre i valori sensibili Singoli metodi per impostare larghezza, altezza, coordinata x, coordinata y, colore o finestra del rettangolo associato su un valore dato Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Un metodo di modifica Definizione // setWidth(): cambia la larghezza public void setWidth(int w) width = w; } Utilizzo Col or edRec t angl e s = new Col or edRec t angl e( ) ; s . s et Wi dt h( 80) ; Object t da o be manipulat ed L'oggetto manipolare è is t hea one by ss quello cui referenced fa riferimento Il valore iniziale parametri formali Init ial value of t hedei formal paramet er deriva from dal parametro comes t he act ualeffettivo paramet er publ i c voi d s et Wi dt h( i nt w) { ... } Changes t o t he paramet er non Le modifiche al formal parametro formale hanno parametro effettivo do not effetto affect tsul he act ual paramet er Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Valutazione di setWidth() ColoredRectangle s = new ColoredRectangle(); s.setWidth(80); L'invocazione un messaggio The invocat ion trasmette sends a message t o t heall'oggetto ColoredRect angle ColoredRectangle cui faitriferimento nel e. quale definita la referenced by s t o amodify s widt h at ts,ribut To doè so, modifica dell'attributo. Per svolgere questa operazione, il flusso t di here is a t emporary t ransfer of flow of cont rol t o controllo viene temporaneamente trasferito a setWidth(). Il set Widt del h().parametro The value of t he actèual valore effettivo 80paramet er is 80 public class ColoredRectangle { ... // setWidth(): width mutator public void setWidth(int w) { width = w; } ... } Per tl'invocazione For his invocat iondelof metodo met hod setWidth(), w viene set Widt h(), w is init ialized t o inizializzato su 80. L'oggetto a 80. The being all'interno referenced cui si faobject riferimento wit t he del metmetodo hod body delhin corpo è is t he l'oggetto a cui fa riferimento s object referenced by s Il metodo la variabile d'istanza width Met hod setsetWidth() Widt h() setimposta s t he inst ance variable widt h of it s del suo oggetto ColoredRectangle. Per questa ColoredRect angle. For t his invocat ion, widt h is set t o 80 invocazione, width viene impostata su 80, e l'oggetto and t he ColoredRectè angle he fa oneriferimento referenceds by s ColoredRectangle quelloisa tcui Met hod setsetWidth() Widt h() is ha complet Cont rol isviene t ransferred back t o Il metodo finito.ed. Il controllo restituito aveva richiamato tall'istruzione he st at ementche t hat invoked set WidtsetWidth() h() Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Dettagli Considerare ColoredRectangle r = new ColoredRectangle(); r.paint(); r.setWidth(80); r.paint(); Qual è la larghezza del rettangolo sullo schermo dopo l'esecuzione della funzione di modifica? Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Altre funzioni di modifica public void setHeight(int h) height = h; } public void setX(int ulx) x = ulx; } public void setY(int uly) y = uly; } public void setWindow(JFrame f) window = f; } public void setColor(Color c) color = c; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Utilizzo della funzione di modifica ColoredRectangle u = new ColoredRectangle(); Sends a message to Trasmette un ColoredRectangle v = new ColoredRectangle(); messaggio all'oggetto u's ColoredRect angle u.setHeight(100); ColoredRectangle di u tper o modify it s height modificare in 100 u.setColor(Color.PINK); at t ribut e per t o 1l'altezza 00 l'attributo v.setX(25); v.setY(50); Trasmette un messaggio Sends a message t o u's ColoredJFrame display = all'oggetto ColoredRectangle di u Rect angle t o modify it s color per modificare in rosa l'attributo new JFrame("Fun"); at t ribut e t o pink per il colore v.setWindow(display); Trasmette un messaggio Sends a message t o v's Coloredall'oggetto ColoredRectangle di v Rect angle t o modify it s window per modificare l'attributo window la finestra atint modo ribut eda t ovisualizzare display's JFrame JFrame di s Trasmette un messaggio Sends a message t o v's Coloredall'oggetto ColoredRectangle di v Rect angle t o modify it s x-axis per modificare in 25 l'attributo posit t o 25 dell'asse x per laion posizione Trasmette un messaggio Sends a message t o v's Coloredall'oggetto di v Rect angleColoredRectangle t o modify it s y-axis per modificare in 50 l'attributo positlaion t o 50 dell'asse y per posizione Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Funzioni di accesso Proprietà Non richiede parametri Ogni esecuzione della funzione di accesso produce un valore di ritorno Il valore di ritorno è il valore dell'invocazione Il tipo ritorno metodo precede il nome The metdihod ret urndel t ype precedes t he name of t hedel metmetodo hod in t he nella definizione met hod definit ion public int getWidth() { return width; } For hod get getWidth(), Widt h(), t he ret urn value t he value t he widt h Per met il metodo il valore di is ritorno è il of valore dell'attributo perColoredRect la larghezza dell'oggetto at t ribut e for t he angle associat edColoredRectangle wit h t he invocat ion. associato con l'invocazione. Nell'invocazione In invocat ion t .get Widt h(), t he ret urn value is t hedi value of t he t.getWidth(), il valore di tritorno è il valore della variabile inst ance variable widt h for he ColoredRect angle referenced by t d'istanza width per l'oggetto ColoredRectangle a cui fa riferimento t Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Utilizzo della funzione di accesso ColoredRectangle t = new ColoredRectangle(); int w = t.getWidth(); L'invocazione trasmette un messaggio ColoredRectangle a Invocat ion sends a message t o t he all'oggetto ColoredRect angle cui fa riferimento perurn restituire il valore suo h. attributo width. referenced by t t ot, ret t he value of itdel s widt To do so, Per svolgere questa operazione, il flusso di controllo viene t here is a t emporary t ransfer of flow of cont rol t o get Widt h() temporaneamente trasferito a getWidth() public class ColoredRectangle { ... Il Met metodo comincia hodgetWidth() get Widt h() st art sl'esecuzione. execut ing. // getWidth(): accessor Per questa invocazione, l'oggetto a cui si fa For t his invocat ion, t he object being public int getWidth() { riferimento all'interno del corpo è l'oggetto a is tthe object referenced by t return width; cuireferenced fa riferimento } The ret urn expression evaluat es t o 40 (t he widt h Il risultato dell'espressione return è 40 (l'attributo per la larghezza dell'oggetto cui fa riferimento t) at t ribut e ofColoredRectangle t he ColoredRecta angle object referenced by t ) ... } Il metodo getWidth() termina fornendo il valore di ritorno (40) all'istruzione Met hod complet es by supplying it s ret urn value (40) t o t he invoking che l'aveva invocato. Inoltre, l'istruzione che aveva effettuato l'invocazione st at ement . Also, invoking stAatquesto ementpunto, regains t he flowwofviene continizializzata rol. From riprende il controllo del flusso. la variabile il valore di ritorno w viene inizializzata su 40)io tcon here variable w is initdell'invocazione ialized wit h t(ossia, he ret urn value of t he invocat Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Costruzione specifica public ColoredRectangle(int w, int h, int ulx, int uly, JFrame f, Color c) setWidth(w); setHeight(h); setX(ulx); setY(uly); setWindow(f); setColor(c); } Richiede valori per ogni attributo JFrame display = new JFrame("Even more fun"); display.setSize(400, 400); ColoredRectangle w = new ColoredRectangle(60, 80, 20, 20, display, Color.YELLOW); Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Costruzione specifica public ColoredRectangle(int w, int h, int ulx, int uly, JFrame f, Color c) setWidth(w); setHeight(h); setX(ulx); setY(uly); setWindow(f); setColor(c); } Vantaggi dell'utilizzo delle funzioni di modifica Leggibilità Meno soggette a errori Facilitano i perfezionamenti con la localizzazione Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Vedere doppio import java.io.*; import java.awt.*; public class SeeingDouble public static void main(String[] args) throws IOException ColoredRectangle r = new ColoredRectangle(); System.out.println("Enter when ready"); System.in.read(); r.paint(); r.setY(50); r.setColor(Color.RED); r.paint(); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Vedere doppio