Ante todo nos alegra que te guste nuestro foro y que sea útil.
Respondiendo a tu pregunta, cuando haces instanciación directa con el hijo ya no estás aprovechando las ventajas del polimorfismo. Es decir:
Futbolista iniesta = new Futbolista(2, "Andres", "Iniesta", 29, 6, "Interior Derecho");
En vez de aprovechar la ventaja:
SeleccionFutbol iniesta = new Futbolista(2, "Andres", "Iniesta", 29, 6, "Interior Derecho");
Esto tiene su sentido cuando "iniesta" no sabes si te va a llegar un objeto de tipo Futbolista, Masajista o Entrenador. Es decir, que en la variable "iniesta" si es tipo SeleccionFutbol, admitirás los tres tipos (Futbolista, Masajista o Entrenador), pero si "iniesta" es de tipo Futbolista pues será exclusivo de ese tipo (por eso también te funciona el código que has modificado, pero encorsetas mucho su uso).
Para que quede más claro, otro ejemplo del polimorfismo en Java se usa mucho en los listados:
List<String> MiLista = new ArrayList<String>();
Donde MiLista admite ArrayList pero también otros tipos que hereden de List (como AbstractList, ArrayList, LinkedList, RoleList, Vector y otros tantos más que podemos consultar en https://docs.oracle.com/javase/7/docs/api/java/util/List.html). Al utilizar polimorfismo creamos código de mantenimiento más sencillo, ya que si mañana por lo que sea en vez de querer utilizar un ArrayList queremos utilizar un LinkedList, nos va a funcionar igual:
List<String> MiLista = new LinkedList<String>();
Espero que quede más claro.