6. Ereditarietà
È possibile stabilire tra classi una relazione del tipo “B è sottoclasse di A”: è una relazione riflessiva e transitiva.
Ex. public class B extends A {...}
A
viene detta classe base, antenata, padre o superclasse; B
viene detta classe derivata, discendente, figlia, erede o subclasse.
La subclasse eredita tutte le implementazioni (attributi e metodi) della superclasse.
Una subclasse può aggiungere altri attributi e metodi, ma può ache ridefinire i metodi presenti nella superclasse.
public class Car{
private String model;
private Boolean on;
public Car(String model) {
this.model = model;
this.on = false;
}
public void turnOn(){
this.on = true;
}
public Boolean canStart(){return true;}
}
public class ElectricCar extends Car{
private Boolean batteries;
public void recharge(){ this.batteries = true;}
}
Overriding
Una subclasse può ridefinire l’implementazione di un metodo, ma l’header del metodo non deve cambiare.
// Faccio l'override di turnOn in ElectricCar
@Override
public void turnOn() {
// Altra implementazione del metodo
}
Con l’override è possibile cambiare il modificatore di visibilità di un metodo: è possibile allentare la restrizione di visibilità del metodo, ma è illegale fare il contrario.
Quindi per esempio, passare da public
a private
non va bene e l’override è considerato illegale; invece, per esempio, passare da protected
a public
è considerato lecito.
Pseudo-variabile super
Nei metodi delle sottoclassi a volte è necessario riferirsi agli attributi o ai metodi della superclasse: ciò si può fare usando la pseudo-variabile super
, come facevamo con this
.
Costruttori delle classi eredi
I costruttori non vengono ereditati dalle classi eredi, siccome anche i nuovi attributi devono essere inizializzati.
Per inizializzare gli attributi ereditati come private
è necessario, all’interno di un costruttore, chiamare prima il costruttore della superclasse e poi fare il resto delle operazioni.
public ElectricCar(String model){
super(model); // Così chiamo il costruttore della superclasse
this.batteries = false;
}