![]() ![]() |
|
![]() ![]() |
Una volta stabilita l'interfaccia pubblica della classe, si può passare alla sua realizzazione. Occorre dunque scrivere una classe con queste componenti:
|
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
Specifichiamo come costruire i nuovi oggetti
implementando i costruttori:
|
![]() ![]() |
|
![]() ![]() |
Le variabili di istanza di un oggetto appena costruito
possono essere inizializzate in tre modi diversi:
|
![]() ![]() |
|
![]() ![]() |
Principio di incapsulamento:
Vantaggio: garanzia che un oggetto non venga posto accidentalmente in uno stato non corretto. Ad esempio, nella classe
BankAccount
vogliamo impedire che balance diventi negativo, dobbiamo
quindi proteggere la variabile da assegnamenti arbitrari...
Se balance fosse
dichiarata public potremmo eseguire i seguenti comandi:
Suggerimento: dichiarare le variabili d'istanza sempre private (o protected, come vedremo quando introdurremo l'ereditarietà...). |
![]() ![]() |
|
![]() ![]() |
Aggiungiamo infine ai metodi il loro corpo,
cioè le istruzioni che devono essere eseguite quando il metodo è
invocato:
Si noti che nel corpo dei metodi si possono usare sia i parametri formali (amount) che le variabili di istanza (balance) ed eventuali variabili locali (newBalance). Come sappiamo, il comando
termina l'esecuzione del metodo e restituisce il valore di <espressione> come risultato dell'invocazione del metodo. |
![]() ![]() |
|
![]() ![]() |
public class BankAccount { private double balance; public BankAccount() { balance = 0; } public BankAccount(double initialBalance) { balance = initialBalance; } public void deposit(double amount) { balance = balance + amount; } public void withdraw(double amount) { double newBalance = balance - amount; if (newBalance >= 0) balance = newBalance; } public double getBalance() { return balance; } } |
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
Tre diversi tipi di variabili:
Le variabili parametro e le variabili locali appartengono ad un metodo. Vengono allocate nel record di attivazione del metodo, e quindi sono eliminate quando il metodo termina l'esecuzione (e il record di attivazione viene disallocato dalla pila). Le variabili di istanza appartengono ad un oggetto. Vengono allocate nello heap (come, ad esempio, le variabili che costituiscono un array). Possono essere eliminate dal garbage collector solo quando l'oggetto diventa inaccessibile. Le variabili vengono inizializzate automaticamente? Le variabili di istanza e gli elementi di
un array, come tutte le
variabili allocate nello heap, vengono inizializzate ad
un valore predefinito:
Invece le variabili locali, come tutte le variabili allocate nello stack, devono essere inizializzate
esplicitamente dal programma, altrimenti il compilatore
segnalerà un errore. |
![]() ![]() |
|
![]() ![]() |
I parametri
espliciti di un metodo (statico o di istanza)
sono i parametri formali, dichiarati tra parentesi tonde dopo il nome
del metodo. Il parametro implicito di un metodo di istanza è l'oggetto sul quale il metodo viene invocato. Quando all'interno di un metodo di istanza ci si riferisce ad una variabile di istanza, si intende la variabile di istanza del parametro implicito, ovvero dell'oggetto su cui il metodo è stato invocato. È possibile accedere al parametro implicito
usando la parola chiave Esempi:
|
![]() ![]() |
|
![]() ![]() |
|