Invocare un metodo della superclasse
Problema di ricorsione nel metodo deposit
Completiamo il metodo: dobbiamo versare una somma e sommarla a balance. Non possiamo modificare BankAccount direttamente balance, che è una variabile privata. L'unico modo per aggiungere una somma di denaro a balance è l'invocazione del metodo deposit.
Così non funziona, perché il metodo diventa ricorsivo:
public class SavingsAccount extends BankAccount {
public void deposit(double amount) {
deposit(amount); // NON FUNZIONA ricorsione infinita!!!
withdraw(FEE);
}
Utilizzo di super per invocare metodi della superclasse
Per invocare il metodo della superclasse anziché il metodo con lo stesso nome (sovrascritto) della classe corrente, si usa super.nomeMetodo(parametri). super è un riferimento all'oggetto parametro implicito del metodo, come il riferimento this, e viene creato al momento dell'invocazione del metodo, analogamente a this.
Tuttavia, super tratta l'oggetto a cui si riferisce come se fosse un esemplare della superclasse: questa è l'unica differenza tra super e this.
Conversioni di tipo tra superclasse e sottoclasse
Un oggetto di tipo SavingsAccount è un caso speciale di oggetti di tipo BankAccount. Una variabile oggetto del tipo di una superclasse può riferirsi a un oggetto di una classe derivata, quindi non c'è nessuna "conversione" effettiva, cioè non vengono modificati i dati.
Esempio di conversione
SavingsAccount collegeFund = new SavingsAccount(10); // creo un oggetto
BankAccount anAccount = collegeFund; // converto l'oggetto in un oggetto BankAccount
Object anObject = collegeFund; // o anche in un oggetto di tipo Object
Conversione implicita e esplicita
La conversione tra riferimento a sottoclasse e riferimento a superclasse può avvenire anche implicitamente (come int e double). Il compilatore sa che il metodo richiede un riferimento di tipo BankAccount, quindi effettua la conversione automaticamente.
BankAccount other = new BankAccount(1000);
SavingsAccount sAcct = new SavingsAccount(10);
other.transfer(500, sAcct);
Conversione esplicita di superclassi in sottoclassi
Per convertire un riferimento a superclasse in un riferimento a sottoclasse serve una conversione esplicita. Se in fase di esecuzione bAcct non punta effettivamente a un oggetto SavingsAccount, l'interprete lancia una ClassCastException.
BankAccount bAcct = sAcct;
SavingsAccount sAcct2 = (SavingsAccount) bAcct;
-
Informatica
-
Informatica I - come costruire una sottoclasse in java
-
Informatica I - la conversione da classe ad interfaccia in java
-
Informatica