Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
4
respuestas

¿Cuál es la salida?

Creo que hay un error en la respuesta a este ejercicio.

Se nos enseñó que se puede inicializar un objeto con de clase hija con una referencia a la clase madre, pero que no se pueden utilizar los métodos del hijo porque se referencía a la madre, misma que no los incluye.

Siguiendo esta lógica y atendidiendo al ejercicio, podemos inicializar tanto a carro como a moto como un Vehiculo pero ninguna de las instancias podría acceder a su método propio de encender Carro o Moto porque su referencia es Vehículo. Esto daría como resultado que se imprimiera Encendiendo Vehículo dos veces.

Espero su respuesta.

Saludos Cordiales.

4 respuestas

¡Hola Héctor!

Gracias por tu pregunta. Entiendo tu duda y te puedo decir que, en efecto, cuando se inicializan los objetos como Vehículo, no se pueden acceder a los métodos propios de las clases hijas. Sin embargo, la salida del ejercicio dependerá de cómo se hayan implementado las clases y los métodos.

Te sugiero revisar nuevamente el código y verificar si se está haciendo uso de la herencia y el polimorfismo de manera correcta. Si aún tienes dudas, por favor, comparte el código del ejercicio para poder ayudarte de manera más precisa.

¡Espero haber ayudado y buenos estudios!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

Saludos Eric.

Adjunto el código del ejercicio para resolver mi duda. La respuesta que marca el ejercicio que se impriman "Encendiendo Moto" y "Encendiendo Carro", pero como puede ver, el tipo de ambas instancias es vehículo, por lo que las instancias no podrían acceder al método de encendido de Moto y Carro respectivamente.

Quedo en espera de su respuesta.

public class Vehiculo {
    public void encender() {
        System.out.println("Encendiendo vehículo");
    }
}

class Carro extends Vehiculo {
    public void encender() {
        System.out.println("Encendiendo Carro");
    }
}

class Moto extends Vehiculo {
    public void encender() {
        System.out.println("Encendiendo Moto");
    }
}

public class Teste {

    public static void main(String[] args) {

        Vehiculo m = new Moto();
        m.encender();

        Vehiculo c = new Carro();
        c.encender();
    }

}

Hola, Hector, lo que pasa es que ambas las instancias son del tipo más específico, es decir m es una instancia de Moto y c es una instancia de Carro. Si queres probarlo, puedes agregar el código a tu IDE junto al código abajo:

System.out.println(m.getClass());
System.out.println(c.getClass());

El método .getClass() nos informa cual es el tipo de la clase del objeto instanciado. En la consola, verás que los objetos instanciados pertenecen a las clases Moto y Carro. La ventaja de declararlos inicialmente a partir de la superclase es que, si necesitas, podrás cambiar la implementación en una etapa posterior de tu proyecto, solamente cambiando la segunda parte de la expresión para la clase que necesites.

Además, en casos de polimorfismo, el método llamado siempre será el de la clase más específica que lo implemente.

Un saludo!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

Hola Me parece que Hector se refiere a la clase 3 "Entendiendo Polimorfismo / Introducción a Polimorfismo" https://app.aluracursos.com/course/java-parte-3-entendiendo-herencia-interfaces/task/73464 En esa clase el instructor hace algo similar al ejercicio del Vehículo, Carro y Moto, sin embargo no funciona igual.

Para resumir esa clase:

class Gerente extends Funcionario

Asimismo en la clase Gerente se tiene:

public boolean iniciarSesion (String clave) {
    return clave == "AluraCursosOnline";
}

//este método no está en la clase Funcionario, está únicamente en la clase Gerente

Luego se crea un objeto de la siguiente manera y se intenta llamar al método iniciarSesion()

Funcionario funcionario = new Gerente ();

funcionario.iniciarSesion()
//aún faltó ingresar el argumento pero hasta ese momento el IDE ya mostraba el siguiente error: "This method iniciarSesion() is undefined for the type Funcionario"

El instructor no pudo ejecutar el método iniciarSesion() de esta manera, porque ese método no existe en la clase Funcionario, a pesar que existe en la clase Gerente, y por lo tanto no puede acceder a él al ser un método propio de Gerente. Por eso ese caso parece contradictorio con el ejercicio del Vehiculo, Carro, Moto; ya que en ambos casos se creó el objeto de la misma manera y se hizo el llamado al método de la clase hija, pero en un caso el llamado fue exitoso y en el otro no.

Lo que hice entonces fue copiar el código del ejercicio del Vehículo, Carro y Moto en el IDE, y luego comenté el método encender() de la clase Vehículo, para asemejarlo a la situación que mostró el instructor durante la clase y entonces ya no compilaba el código y aparecía el mismo error que le apareció al instructor: "This method encender() is undefined for the type Vehiculo"

Con esto y además modificando el código que el instructor mostró durante la clase (para asemejarlo al ejercicio del Vehiculo), me di cuenta que en primer lugar debe existir el método en la clase padre para que al hacer el llamado se tenga acceso a ese método y a su vez el mismo método debe estar sobreescrito en las clases hijas y es entonces que el método llamado será de la clase más especifica que lo implemente (ya se puede hacer esta comparación al ya existir el método en la clase padre y estar sobreescrito en la hija), por eso que en este ejercicio la salida es:

Encendiendo Moto
Encendiendo Carro

Escribí esto con la intención de contribuir porque esto también me generó dudas por la aparente contradicción que hubo entre la clase del instructor y el ejercicio del Vehiculo, pero si hay algo inexacto en este razonamiento por favor háganme saber.

Gracias.