come mai una superclasse può essere assegnata ad una sottoclasse?

qui : http://www.math.unipd.it/~laurap/did...na11_6pgbn.pdf
ho trovato :
Può esserci la necessità di memorizzare un riferimento di una sottoclasse in un riferimento a superclasse.
Ma quale può essere questa necessità?

questo codice :
codice:
class SottoClasse extends SuperClasse {
	public void qualcosa (){}
}
public class SuperClasse {
	public static void main(String[] args) {
		SottoClasse ssc = new SottoClasse();
		SuperClasse sc = new SuperClasse();
		sc = ssc;
		ssc.qualcosa();
		sc.qualcosa();
	}
}
Compila e funziona. sc dopo l'assegnamento è diventata SottoClasse. Non riesco a capire questo funzionamento, mi sembra che l'ereditarietà venga rovesciata.
Inoltre sebbene getClass mi dica che sc è SottoClasse non vedo (giustamente) il metodo perchè in teoria non è della sua classe.
Allora perchè è permesso questo assegnamento??
E la reflection dopo ha senso?