Autor Tema: herencia diferencia entre instanciar y referenciar invocar de forma directa o in  (Leído 2451 veces)

Pedro13

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Buenas!! Tengo una duda con este ejercicio (ver esquema de herencia más abajo), en el cual se pide qué método puede invocar referencia de forma directa. Y si se podría invocar el método multiplicar y en caso afirmativo cuál sería el de la clase 1 o el de la clase 2. Muchas gracias!!

Clase1 referencia = new Clase4()


ESQUEMA DE HERENCIA

Esquema de herencia:

Superclase Clase 1

Métodos: sumar(), restar(), multiplicar()


Clase que hereda de Clase 1: Clase 2

Métodos: multiplicar()

Clase que hereda de Clase 1: Clase 3

Métodos: sumar()

Clase que hereda de Clase 2: Clase 4

Método: potenciacion()
« Última modificación: 13 de Abril 2022, 18:33 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Duda con ejercicio de herencia
« Respuesta #1 en: 02 de Junio 2021, 00:39 »
Clase1 referencia = new Clase4()

Ahí se está instanciando un objeto de Clase4.
Sin embargo, se está referenciando como un objeto de Clase1.

Por lo tanto, de forma directa, solo podrán invocarse los métodos de Clase1.

Sin embargo, al invocar el método multiplicar(), como está sobreescrito en Clase2, será este método el que se ejecute, a pesar de que la referencia está como Clase1.

No podrá invocarse el método potenciacion() de forma directa. Sería necesario hacer un casting a Clase4, aún cuando lo que hemos instanciado es precisamente un Clase4.

Este es un buen ejercicio para distinguir entre los conceptos "instanciar" y "referenciar".


Puedes ponerlo a prueba mediante el código que dejo abajo.
Incluso puedes probarlo también y hacer más pruebas, en este editor online:
https://www.online-ide.com/8c6koBTxQv

Código: [Seleccionar]
public class Main
{
    public static void main(String[] args) {
       
        Clase1 referencia = new Clase4(); //Instanciamos un Clase4, pero lo referenciamos como Clase1
       
        referencia.multiplicar(); //Multiplicar de Clase2, aunque la referencia es Clase1, pero Clase2 lo ha sobreescrito
       
        ((Clase4) referencia).potenciacion(); //Para llamar a potenciacion() se requiere casting, a pesar de que es una instancia de Clase4
    }
   
    static class Clase1 {
        public void sumar() {
            System.out.println("Sumar de clase 1");
        }
        public void restar() {
            System.out.println("Restar de clase 1");
        }
        public void multiplicar() {
            System.out.println("Multiplicar de clase 1");
        }
    }
   
    static class Clase2 extends Clase1 {
        public void multiplicar() {
            System.out.println("Multiplicar de clase 2");
        }
    }
   
    static class Clase3 extends Clase1 {
        public void sumar() {
            System.out.println("Sumar de clase 3");
        }
    }
   
    static class Clase4 extends Clase2 {
        public void potenciacion() {
            System.out.println("Potenciacion de clase 4");
        }
    }
}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".