L'esempio da te fatto è sicuramente pertinente con la mia situazione: per correttezza ti posso svelare un retroscena. Oltre al Dispatch dei metodi sto incontrando ovvie difficoltà anche con classi dichiarate abstract e con le interfaccie; per le ultime due però ho trovato sul forum delle discussioni già aperte, che almeno nel caso di abstract mi hanno chiarito qualcosa (le interfaccie ancora sono mistero al 100%), tanto è che mi sono creato questo esempio basandomi su una delucidizione letta in un post, esempio che bada caso è proprio quello dell'area!

codice:
abstract class Poligono {
	int base;
	int altezza;
	abstract double area();
}

class Triangolo extends Poligono {
	Triangolo(int b, int h) {
		this.base = b;
		this.altezza = h;
	}
	double area() {
		return (altezza*base/2);
	}
}

class Quadrato extends Poligono {
	Quadrato(int lato) {
		this.base = lato;
		this.altezza = lato;
	}
	double area() {
		return (base*altezza);
	}
}

class CalcoloArea {
	public static void main(String args[]) {
		Poligono T1 = new Triangolo(10, 5);
		Poligono Q1 = new Quadrato(3);
		System.out.println("Area Triangolo: " + T1.area());
		System.out.println("Area Quadrato: " + Q1.area());
	}
}
Con tale esempio ho iniziato ad intuire quale possa essere l'uso di abstract... vedendo quello fatto da te vedo anche ciò che io nel mio non sono riuscito a fare, cioè chiamare un metodo come visualizzaArea che si comporta in conseguenza dell'oggetto che gli viene passato!
Forse per qualcuno ho scoperto l'acqua calda ma vi assicuro che dopo anni e anni di procedure gli oggetti sono un po ostici!