Una classe astratta è una classe che, di per se, non può essere istanziata perchè mancano delle caratteristiche atte a specificarla.
Un buon esempio è la classe Figura.
Non puoi, intuitivamente, istanziare una Figura perchè non stai specificando di che tipo di figura si tratta (un rettangolo? un triangolo? un cerchio?).
Nonostante questa "astrattezza", la classe Figura ha ragione di esistere per poter raggruppare tutte le sue sottoclassi. Pensa ad esempio ad un metodo che, presa una qualsiasi figura, stampa a video la sua area, indipendentemente dalla figura passata come parametro.
Vediamo, quindi, di concretizzare l'esempio:
codice:
public abstract class Figura {
private int numLati;
public Figura(int numLati) { this.numLati = numLati; }
public abstract double calcolaArea();
}
public class Rettangolo extends Figura {
private int base;
private int altezza;
public Rettangolo() { this(base, altezza); }
public Rettangolo(int base, int altezza) {
super(4); // Ha 4 lati
this.base = base;
this.altezza = altezza;
}
public double calcolaArea() { return (double) base * altezza; }
public String toString() { return "Rettangolo"; }
}
public class Triangolo extends Figura {
private int base;
private int altezza;
public Triangolo() { this(base, altezza); }
public Triangolo(int base, int altezza) {
super(3); // Ha 3 lati
this.base = base;
this.altezza = altezza;
}
public double calcolaArea() { return (double) (base * altezza) / 2; }
public String toString() { return "Triangolo"; }
}
Ora, un metodo di una terza classe che volesse stampare a video l'area di una qualsiasi figura:
codice:
public void stampaArea(Figura f) {
System.out.println("L'area della figura " + f + " è: " + f.calcolaArea());
}
...
Rettangolo r = new Rettangolo(4, 5);
Tritangolo t = new Tritangolo(3, 4);
stampaArea( r );
stampaArea( t );
In questo modo non mi devo preoccupare di controllare il tipo di oggetto passato: so che la figura ha un metodo calcolaArea() e lo uso. Verrà chiamato automaticamente il metodo appropriato in base alla sottoclasse che effettivamente è stata istanziata.
Ciao.