Hola de nuevo fedegaray
La primera pregunta. Correcta, con un casting podemos lograrlo:
Vehiculo carro1 = new Vehiculo();
Taxi taxi1 = new Taxi();
Casting : taxi1 = (Taxi) carro1;
La segunda pregunta también esta bien... en cuanto la tercera pregunta, lee este parrafo:
en tiempo de ejecución Java está constantemente “buscando” (“ligando” o “despachando”) el método que corresponda en función del tipo dinámico al que apunta una variable. Si el método invocado no se encuentra definido en el tipo dinámico de que se trate, Java busca el método en la superclase para tratar de ejecutarlo.
Yo me estuve preguntando en esa pregunta que pasa, como es, y esto fue lo que capte:
primero buscara en Taxi, si no encuentra dicho metodo en Taxi, prosigue buscando en las superclases subclases... y así sucesivamente...Espero haberte ayudado en algo! saludos!