martedì 27 maggio 2014

Programmazione: Capitolo 3, Parte 2

Campi di esemplare
§ Un oggetto memorizza i propri dati all’interno di campi (o variabili) di
esemplare (o di istanza)
§ Campo è un termine tecnico che identifica una posizione all’interno di
un blocco di memoria
§ Un esemplare (o istanza) di una classe è un oggetto creato da quella
classe.
§ La dichiarazione della classe specifica i suoi campi di esemplare:
public class BankAccount
{
. . .
private double balance;
}

Campi di esemplare
§ La dichiarazione di un campo di esemplare è così
composta:
§ Uno specificatore d’accesso (solitamente private)
§ Il tipo del campo di esemplare (come double)
§ Il nome del campo di esemplare (come balance)
§ Ciascun oggetto di una classe ha il proprio insieme
di campi di esemplare.
§ I campi di esemplare sono generalmente dichiarati
con lo specificatore di accesso private




Campi di esemplare
Campi di esemplare

Campi di esemplare

Sintassi 3.4:
Dichiarazione di campo di esemplare
specificatoreDiAccesso class NomeClasse
{
specificatoreDiAccesso tipoVariabile nomeVariabile;
. . .
{
Esempio:
public class BankAccount
{
private double balance;
}
Obiettivo:
Definire un campo che sia presente in ciascun oggetto di una classe.

Accedere ai campi di esemplare
§ I campi di esemplare sono generalmente dichiarati con lo
specificatore di accesso private: a essi si può
accedere soltanto da metodi della medesima classe e da
nessun altro metodo.
§ Se i campi di esemplare vengono dichiarati privati, ogni
accesso ai dati deve avvenire tramite metodi pubblici.
§ L’incapsulamento prevede l’occultamento dei dati degli
oggetti, fornendo metodi per accedervi.


Accedere ai campi di esemplare
§ Ad esempio, alla variabile balance si può accedere dal
metodo deposit della classe BankAccount, ma non dal
metodo main di un’altra classe.
public class BankRobber
{
public static void main(String[] args)
{
BankAccount momsSavings = new BankAccount(1000);
. . .
momsSavings.balance = -1000; // ERRORE
}
}
Realizzare i costruttori
§ Un costruttore assegna un valore iniziale ai campi di
esemplare di un oggetto.
public BankAccount()
{
balance = 0;
}
public BankAccount(double initialBalance)
{
balance = initialBalance;
}

Esempio di invocazione di un costruttore

BankAccount harrysChecking = new BankAccount(1000);
§ Creazione di un nuovo oggetto di tipo BankAccount.
§ Invocazione del secondo costruttore (perché è stato fornito un
parametro di costruzione).
§ Assegnazione del valore 1000 alla variabile parametro
initialBalance.
§ Assegnazione del valore di initialBalance al campo di esemplare
balance dell’oggetto appena creato.
§ Restituzione, come valore dell’espressione new, di un riferimento a un
oggetto, che è la posizione in memoria dell’oggetto appena creato.
§ Memorizzazione del riferimento all’oggetto nella variabile
harrysChecking.

Realizzare metodi
§ Alcuni metodi non restituiscono un valore
§ Alcuni metodi restituiscono un valore
public void withdraw(double amount)
{
double newBalance = balance - amount;
balance = newBalance;
}
public double getBalance()
{
return balance;
}

Esempio di una invocazione di metodo
§ Assegnazione del valore 500 alla variabile parametro amount.
§ Lettura del campo balance dell’oggetto che si trova nella posizione
memorizzata nella variabile harrysChecking.
§ Addizione tra il valore di amount e il valore di balance,
memorizzando il risultato nella variabile newBalance.
§ Memorizzazione del valore di newBalance nel campo di esemplare
balance, sovrascrivendo il vecchio valore.
harrysChecking.deposit(500);

Sintassi 3.5: L'enunciato return
return espressione;
oppure
return;
Esempio:
return balance;
Obiettivo:
Specificare il valore restituito da un metodo e terminare l’esecuzione
del metodo immediatamente. Il valore restituito diventa il valore
dell’espressione di invocazione del metodo.

File BankAccount.java
01: /**
02: Un conto bancario ha un saldo che può essere modificato
03: da depositi e prelievi.
04: */
05: public class BankAccount
06: {
07: /**                                     
08: Costruisce un conto bancario con saldo uguale a zero.
09: */
10: public BankAccount()
11: {
12: balance = 0;
13: }
14:
15: /**
16: Costruisce un conto bancario con un saldo assegnato.
17: @param initialBalance il saldo iniziale
18: */
19: public BankAccount(double initialBalance)
20: {
21: balance = initialBalance;
22: }
23:
24: /**
25: Versa denaro nel conto bancario.
26: @param amount l'importo da versare
27: */
28: public void deposit(double amount)
29: {
30: double newBalance = balance + amount;
31: balance = newBalance;
32: }
33:
34: /**
35: Preleva denaro dal conto bancario.
36: @param amount l'importo da versare
37: */
38: public void withdraw(double amount)
39: {
40: double newBalance = balance - amount;
41: balance = newBalance;
42: }
43:
44: /**
45: Ispeziona il valore del saldo attuale del conto bancario.
46: @return il saldo attuale
47: */
48: public double getBalance()
49: {
50: return balance;
51: }
52:
53: private double balance;
54: }
Collaudare una classe
§ Collaudo di unità: verifica che la classe a sè stante funzioni
correttamente, al di fuori di un programma completo
§ Per collaudare una classe usate un ambiente per il
collaudo interattivo oppure scrivete un’altra classe che
esegua istruzioni di collaudo
§ Classe di test: una classe con un metodo main che
contiene gli enunciati che servono al collaudo di un’altra
classe.
§ Esegue solitamente i passi seguenti:
1. Costruzione di uno o più oggetti della classe che si sta collaudando.
2. Invocazione di uno o più metodi.
3. Visualizzazione di uno o più risultati.
4. Visualizzazione dei risultati previsti.

Collaudare una classe
§ I dettagli per costruire un programma dipendono dal
vostro compilatore e dall’ambiente di sviluppo; nella
maggior parte degli ambienti, dovrete eseguire questi
passi:
1. Creare una nuova cartella per il vostro programma.
2. Creare due file, uno per ciascuna classe.
3. Compilare entrambi i file.
4. Eseguire il programma di collaudo.


File BankAccountTester.java
01: /**
02: Classe di collaudo per la classe BankAccount.
03: */
04: public class BankAccountTester
05: {
06: /**
07: Collauda i metodi della classe BankAccount.
08: @param args non utilizzato
09: */
10: public static void main(String[] args)
11: {
12: BankAccount harrysChecking = new BankAccount();
13: harrysChecking.deposit(2000);
14: harrysChecking.withdraw(500);
15: System.out.println(harrysChecking.getBalance());
16: } // ++++
17: }
Errori comuni
§ Un costruttore non restituisce alcun tipo (neanche void)
public void BankAccount() {…}
è un metodo che si chiama BankAccount e restituisce void
public BankAccount() {…}
è un costruttore per la classe BankAccount
Non usare “return” nei costruttori!


Nessun commento:

Posta un commento