Ejemplo práctico:
Queremos crear conductores y guardarlos en una lista. Éstos conductores pueden ser de 2 tipos, taxistas o choferes de transporte público. También se deberá recuperar los tipos de conductores de la lista.
public class Conductor {
public Conductor() {}
this.id = id;
this.names = names;
this.surnames = surnames;
this.dni = dni;
}
// getters y setters
}
public class Taxista extends Conductor {
public Taxista() {}
super(id, names, surname, dni);
this.placaAuto = placaAuto;
this.horario = horario;
}
// getter y setter
/* si usan getters y setters para los atributos heredados, llamarlos así:
super.setId(id); // set
return super.getId(); // get
*/
}
public class ConductoresBD {
private static final List<Conductores> conductores;
static {
conductores = new ArrayList<>();
}
public void insert(Conductor c) {
conductores.add(c);
}
public void remove(Conductor c) {
conductores.remove(c);
}
}
Ahora, hagamos una clase de prueba:
public class Main {
public static void main
(String[] args
) { final ConductoresBD conductores = new Conductores();
Taxista taxista = new Taxista(1, "Juan Manuel", "Figueroa Orellana",
"45930168", "ZK-34539", "A");
conductores.insert(taxista);
Conductor c = conductores.get(0);
Taxista retrieved = null;
if(c instanceof Taxista) {
retrieved = (Taxista) c;
}
}
La pregunta surge cuando recuperamos los tipos de conductores de la lista, ¿cómo sé qué tipo de objeto he recuperado? Para ésto nos ayudará el operador instanceof:
if(c instanceof Taxista) { /* ... */ }
Lo que el operador instanceof hace es comprobar si el objeto de la izquierda es del mismo tipo que el de la derecha:
¿c es de tipo Taxista?
La respuesta es afirmativa. Por lo tanto, podemos hacer un casting (convertir) del objeto padre hacia el objeto hijo:
Taxista retrieved = (Taxista) c;
Y podemos usar los métodos de Taxista:
retrieved.setPlacaAuto("TK-45905");
retrieved.setHorario("C");
Espero se haya entendido el mensaje. Saludos.