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;
}