Se Padre e' una classe astratta non e' direttamente istanziabile, ma se Figlio ne ridefinisce tutti i metodi astratti puoi istanziare Figlio, chiaramente.
Per tornare al discorso di prima, un valido utilizzo pratico di questa tecnica puo' essere il passaggio di argomenti ad un metodo. Se, ad esempio tu scrivi una classe che deve maneggiare un certo tipo di oggetti, ma vuoi lasciare ad altri la possibilita' di personalizzare gli oggetti, scrivi una classe astratta che stabilisce cio' di cui tu hai bisogno, e utilizzi quella classe per passare l'oggetto come argomento.
codice:
public class Figlio extends Padre }
public void metodoInterno() {
//qui fornisci una implementazione del metodo astratto
}
}
public class Main {
public void metodo1(Padre p) {
p.metodoInterno();
}
.
.
//nella classe principale puoi fare cosi'
Figlio f = new Figlio();
metodo1(f);
.
}
Come vedi metodo1 accetta come parametro un oggetto Padre, una classe astratta definita da te, per assicurarti che in essa esista un metodo chiamato metodoInterno()
Il compito di fornire un'implementazione per quel metodo spetta a un altro programmatore, che scrive una nuova classe, la quale estende Padre, In questo caso un oggetto figlio puo' essere passato come argomento a metodo1().
Spero di essere stato abbastanza chiaro. Non saprei che link darti, io di solito faccio le ricerche nei siti delle universita', in cui si posso no trovare le lezioni on-line (a volte).
Comunque un modo molto efficace per imparare e' provare a fare questi esempi e far stampare una stringa a video dentro ogni costruttore, e dentro ogni metodo, cosi' puoi vedere che parti di codice vengono eseguite.