mercoledì 28 maggio 2014

Programmazione: Capitolo 3, Parte 3

Categorie di variabili
§ Categorie di variabili:
§ Campi di esemplare (a volte chiamati anche variabili di
esemplare o di istanza), come la variabile balance della classe
BankAccount.
§ Variabili locali, come la variabile newBalance del metodo
deposit
§ Variabili parametro, come la variabile amount del metodo
deposit.
§ Un campo di esemplare appartiene a un oggetto
§ Quando viene costruito un oggetto, vengono creati anche
i suoi campi di esemplare, che continuano a “vivere”
finché c’è almeno un metodo che sta usando l’oggetto.
Categorie di variabili
§ La macchina virtuale Java è dotata di un agente, chiamato garbage
collector, “raccoglitore di spazzatura”, che periodicamente elimina gli
oggetti che non sono più utilizzati.
§ Le variabili locali e le variabili parametro appartengono
a un metodo (nascono e muoiono con esso)
§ I campi di esemplare vengono inizializzati a un valore predefinito, mentre
le variabili locali devono essere inizializzate esplicitamente.
Nei costruttori: inizializzare sempre tutte le variabili di esemplare
Nei metodi: inizializzare sempre tutte le variabili locali






Tempo di vita (lifetime) delle variabili
harrysChecking.deposit(500);
double newBalance = balance + amount;
balance = newBalance;
Tempo di vita delle variabili








Tempo di vita (lifetime) delle variabili



Tempo di vita delle variabili

Parametri impliciti ed espliciti nei metodi
§ Il parametro implicito di un metodo è l’oggetto con cui il
metodo viene invocato ed è rappresentato dal riferimento
this.
§ Il riferimento this permette di accedere al parametro
implicito.
§ All’interno di un metodo, il nome di un campo di esemplare
rappresenta il campo di esemplare del parametro implicito.
public void deposit(double amount)
{
double newBalance = balance + amount;
this.balance = newBalance;
}
Parametri impliciti ed espliciti nei metodi
§ balance rappresenta il saldo dell’oggetto a sinistra del punto:
Significa che sto versando sul conto di mamma :-)
double newBalance = momsSavings.balance + amount;
momsSavings.balance = newBalance;
momsSavings.deposit(500)
Parametri impliciti e this
§ Ogni metodo ha un suo parametro implicito (l'oggetto sul quale viene invocato).
§ Il parametro implicito si chiama sempre this.
§ Eccezione: i metodi dichiarati static non hanno alcun parametro implicito, come
vedremo nel cap.8. (non si eseguono su oggetti ma su classi)
§ Quando all’interno di un metodo si fa riferimento a un campo di esemplare, il compilatore fa
riferimento automaticamente al parametro this.
§ Utile per rimuovere ambiguità
momsSavings.deposit(500);
double newBalance = balance + amount;
// ha il seguente significato:
double newBalance = this.balance + amount;
public void setBalance (double balance) {
this.balance = balance;
}





Parametri impliciti e this

Il parametro implicito nell'invocazione di un metodo

Consigli pratici
§ Individuare le classi e, per ciascuna classe,
Identificare i metodi da mettere a disposizione
preleva, versa, ottieniSaldo
Specificare l’interfaccia pubblica (metodi e costruttori)
public void preleva(double importo) …
public ContoBancario(double importoIniziale) …
Scrivere la documentazione per l’interfaccia pubblica
In javadoc, per la classe e per tutti i metodi, costruttori,
parametri, valori restituiti
Identificare le variabili di esemplare
Realizzare (implementare) costruttori e metodi
Collaudare la classe (metodi e costruttori)
§ Non aver paura di tornare sui propri passi per correggere e
Migliorare.



Esercizio
§ Progettare e realizzare una classe che costituisca un
modello di registratore di cassa. La classe dovrebbe
consentire a un cassiere di digitare i prezzi di articoli e la
quantità di denaro pagata dal cliente, calcolando il resto
dovuto.
Identificare i metodi da mettere a disposizione
Specificare l’interfaccia pubblica (metodi e costruttori)
Scrivere la documentazione per l’interfaccia pubblica
Identificare le variabili di esemplare
Realizzare (implementare) costruttori e metodi
Collaudare la classe (metodi e costruttori)
this(...)
§ Java offre la possibilità di invocare un costruttore
dall’interno di un altro costruttore
§ Ad esempio
public BankAccount() {
this(0);
}
§ this(0); significa: “Invoca un altro costruttore di questa
classe e fornisci il valore 0 come parametro di
costruzione”
§ Invocazioni di questo tipo possono avvenire solamente
quale prima riga di un altro costruttore

Disegnare figure complesse
E’ un’ottima idea creare una classe separata per ogni figura
complessa
public class Car
{
public Car(int x, int y)
{
// Posizione
. . .
}
public void draw(Graphics2D g2)
{
// istruzioni per il disegno
. . .
}
}

Disegnare automobili
§ Disegnare due automobili: una nell’angolo superiore sinistro
della finestra e un’altra nell’angolo inferiore destro.
§ Calcolare la posizione in basso a destra nel metodo
paintComponent:
int x = getWidth() – 60;
int y = getHeight() - 30;
Car car2 = new Car(x, y);
§ getWidth e getHeight vengono applicati ad un oggetto
che sta utilizzando il metodo paintComponent.
§ Se la finestra viene ridimensionata, viene nuovamente
invocato il metodo paintComponent e la posizione viene
ricalcolata.

Classi di programmi per disegnare
automobili
§ La classe Car ha il compito di disegnare un’automobile.
Vengono creati due oggetti di tale classe, uno per ogni
automobile.
§ La classe CarComponent visualizza il disegno completo.
§ La classe CarViewer visualizza un frame che contiene
CarComponent.

File Car.java
01: import java.awt.Graphics2D;
02: import java.awt.Rectangle;
03: import java.awt.geom.Ellipse2D;
04: import java.awt.geom.Line2D;
05: import java.awt.geom.Point2D;
06:
07: /**
08: Un’automobile posizionabile ovunque sullo schermo.
09: */
10: public class Car
11: {
12: /**
13: Costruisce un’automobile.
14: @param x la coordinata x dell’angolo in alto a sinistra
15: @param y la coordinata y dell’angolo in alto a sinistra
16: */
17: public Car(int x, int y)
18: {
19: xLeft = x;
20: yTop = y;
21: }
22:
23: /**
24: Disegna l’automobile.
25: @param g2 il contesto grafico
26: */
27: public void draw(Graphics2D g2)
28: {
29: Rectangle body
30: = new Rectangle(xLeft, yTop + 10, 60, 10);
31: Ellipse2D.Double frontTire
32: = new Ellipse2D.Double(xLeft + 10, yTop + 20, 10, 10);
33: Ellipse2D.Double rearTire
34: = new Ellipse2D.Double(xLeft + 40, yTop + 20, 10, 10);
35:
36: // La base del parabrezza
37: Point2D.Double r1
38: = new Point2D.Double(xLeft + 10, yTop + 10);
39: // L’inizio del tettuccio
40: Point2D.Double r2
41: = new Point2D.Double(xLeft + 20, yTop);
42: // La fine del tettuccio
43: Point2D.Double r3
44: = new Point2D.Double(xLeft + 40, yTop);
45: // La base del lunotto posteriore
46: Point2D.Double r4
47: = new Point2D.Double(xLeft + 50, yTop + 10);
48:
49: Line2D.Double frontWindshield
50: = new Line2D.Double(r1, r2);
51: Line2D.Double roofTop
52: = new Line2D.Double(r2, r3);
53: Line2D.Double rearWindshield
54: = new Line2D.Double(r3, r4);
55:
56: g2.draw(body);
57: g2.draw(frontTire);
58: g2.draw(rearTire);
59: g2.draw(frontWindshield);
60: g2.draw(roofTop);
61: g2.draw(rearWindshield);
62: }
63:
64: private int xLeft;
65: private int yTop;
66: }

File CarComponent.java
01: import java.awt.Graphics;
02: import java.awt.Graphics2D;
03: import javax.swing.JComponent;
04:
05: /**
06: Questo componente disegna due automobili.
07: */
08: public class CarComponent extends JComponent
09: {
10: public void paintComponent(Graphics g)
11: {
12: Graphics2D g2 = (Graphics2D) g;
13:
14: Car car1 = new Car(0, 0);
15:
16: int x = getWidth() - 60;
17: int y = getHeight() - 30;
18:
19: Car car2 = new Car(x, y);
20:
21: car1.draw(g2);
22: car2.draw(g2);
23: }
24:}
File CarViewer.java
01: import javax.swing.JFrame;
02:
03: public class CarViewer
04: {
05: public static void main(String[] args)
06: {
07: JFrame frame = new JFrame();
08:
09: frame.setSize(300, 400);
10: frame.setTitle("Two cars");
11: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12:
13: CarComponent component = new CarComponent();
14: frame.add(component);
15:
16: frame.setVisible(true);
17: }
18: }


Nessun commento:

Posta un commento