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