Capitolo 4 Classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 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 © 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 © 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 © 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 © 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);
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Classe ColoredRectangle - versione iniziale 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 © 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 © 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 © 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 © 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 Il messaggio indica che i due oggetti devono essere visualizzati All'oggetto ColoredRectangle a cui fa riferimento r2 viene inviato un messaggio All'oggetto ColoredRectangle a cui fa riferimento r1 viene inviato un messaggio
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 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 x; private int height; private int y; private JFrame window; 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 © 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 x; private int height; private int y; private JFrame window; 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 x; private int height; private int y; private JFrame window; 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 © The McGraw-Hill Companies srl Costruttore predefinito di ColoredRectangle Il nome del costruttore è sempre uguale a quello della classe Un costruttore non riporta un tipo di restituzione. Un costruttore restituisce sempre un riferimento a un nuovo oggetto della sua classe
public class ColoredRectangle { // variabili istanza per contenere attributi dell'oggetto private int width; private int x; private int height; private int y; private JFrame window; 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 © 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
Il valore di una variabile ColoredRectangle è un riferimento a un oggetto ColoredRectangle
public class ColoredRectangle { // variabili istanza per attributi dell'oggetto private int width; private int x; private int height; private int y; private JFrame window; 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 © 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 © The McGraw-Hill Companies srl Sistema di coordinate Java
public class ColoredRectangle { // variabili istanza per attributi dell'oggetto private int width; private int x; private int height; private int y; private JFrame window; 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 © The McGraw-Hill Companies srl Invocazione dei metodi Considerare r1.paint(); // visualizza la finestra associata a r1 r2.paint(); // visualizza la finestra associata a r2 Osservare Quando viene eseguito un metodo istanza, il sistema accede e manipola gli attributi dell'oggetto associati all'invocazione È importante comprendere quale oggetto viene manipolato
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Invocazione dei metodi La variabile d'istanza window fa riferimento all'attributo JFrame dell'oggetto che ha causato l'invocazione. Ossia, l'invocazione di r1.paint() consente l'accesso all'attributo window dell'oggetto ColoredRectangle a cui fa riferimento r1. Analogamente, l'invocazione di r2.paint() consente l'accesso all'attributo window dell'oggetto ColoredRectangle a cui fa riferimento r2 I valori di queste variabili d'istanza sono gli stessi dell'oggetto ColoredRectangle che ha invocato il metodo paint()
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 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 © 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 © The McGraw-Hill Companies srl Un metodo di modifica Definizione // setWidth(): cambia la larghezza public void setWidth(int w) width = w; } Utilizzo Il valore iniziale dei parametri formali deriva dal parametro effettivo Le modifiche al parametro formale non hanno effetto sul parametro effettivo L'oggetto da manipolare è quello a cui fa riferimento s
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Valutazione di setWidth() L'invocazione trasmette un messaggio all'oggetto ColoredRectangle a cui fa riferimento s, nel quale è definita la modifica dell'attributo. Per svolgere questa operazione, il flusso di controllo viene temporaneamente trasferito a setWidth(). Il valore del parametro effettivo è 80 Per l'invocazione del metodo setWidth(), w viene inizializzato su 80. L'oggetto a cui si fa riferimento all'interno del corpo del metodo è l'oggetto a cui fa riferimento s Il metodo setWidth() imposta la variabile d'istanza width del suo oggetto ColoredRectangle. Per questa invocazione, width viene impostata su 80, e l'oggetto ColoredRectangle è quello a cui fa riferimento s Il metodo setWidth() ha finito. Il controllo viene restituito all'istruzione che aveva richiamato setWidth()
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 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 © 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 © The McGraw-Hill Companies srl Utilizzo della funzione di modifica Trasmette un messaggio all'oggetto ColoredRectangle di u per modificare in 100 l'attributo per l'altezza Trasmette un messaggio all'oggetto ColoredRectangle di u per modificare in rosa l'attributo per il colore Trasmette un messaggio all'oggetto ColoredRectangle di v per modificare in 25 l'attributo per la posizione dell'asse x Trasmette un messaggio all'oggetto ColoredRectangle di v per modificare in 50 l'attributo per la posizione dell'asse y Trasmette un messaggio all'oggetto ColoredRectangle di v per modificare l'attributo window in modo da visualizzare la finestra JFrame di s
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 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 di ritorno del metodo precede il nome del metodo nella definizione Per il metodo getWidth(), il valore di ritorno è il valore dell'attributo per la larghezza dell'oggetto ColoredRectangle associato con l'invocazione. Nell'invocazione di t.getWidth(), il valore di ritorno è il valore della variabile d'istanza width per l'oggetto ColoredRectangle a cui fa riferimento t
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Utilizzo della funzione di accesso L'invocazione trasmette un messaggio all'oggetto ColoredRectangle a cui fa riferimento t, per restituire il valore del suo attributo width. Per svolgere questa operazione, il flusso di controllo viene temporaneamente trasferito a getWidth() Il metodo getWidth() comincia l'esecuzione. Per questa invocazione, l'oggetto a cui si fa riferimento all'interno del corpo è l'oggetto a cui fa riferimento t Il risultato dell'espressione return è 40 (l'attributo per la larghezza dell'oggetto ColoredRectangle a cui fa riferimento t) Il metodo getWidth() termina fornendo il valore di ritorno (40) all'istruzione che l'aveva invocato. Inoltre, l'istruzione che aveva effettuato l'invocazione riprende il controllo del flusso. A questo punto, la variabile w viene inizializzata con il valore di ritorno dell'invocazione (ossia, w viene inizializzata su 40)
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 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 © 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 © 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 © The McGraw-Hill Companies srl Vedere doppio