Autor Tema: Qué significa super en java y ejemplo de código con herencia Ejercicio CU00692B  (Leído 4281 veces)

Enzo

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 82
    • Ver Perfil
Buenas Tardes,

Aquí dejo mi ejercicio del tema "CU00692B super invocar metodos superclases subclases java ejemplo basico" para su corrección:

Clase Profesor:

Código: [Seleccionar]
/**
 * EJEMPLO DE HERENCIAS, MÉTODOS POLIMÓRFICOS Y USO DE SUPER PARA LLAMAR A MÉTODOS DE SUPERCLASE.<br>
 * Esta Clase define una Superclase de la que "beberan" otras clases.<br>
 * Clase 1 del Ejercicio del Tema "CU00692B super invocar metodos superclases subclases java ejemplo basico".
 * @author Lorenzo Fernández Asensio
 * @version 20151201.01
 */
public class Profesor_CU00692B {

    // Inicialización de Atributos
    private String nombre;
    private int edad,
                agnosConsolidados;

    /**
     * Constructor 1 del Producto. Atribututos sin asignación de Valores
     * @param nombre El parámetro nombre define el Nombre del Profesor
     * @param edad El parámetro edad define la edad del Profesor
     * @param agnosConsolidados El parámetro agnosConsolidados define los años consolidados que lleva el Profesor
     */
    public Profesor_CU00692B () {
        nombre = "";
        edad = 0;
        agnosConsolidados = 0;
    } // Cierre del constructor 1

    /**
     * Constructor 2 del Producto. Atribututos con asignación de Valores
     * @param nombre El parámetro nombre define el Nombre del Profesor
     * @param edad El parámetro edad define la edad del Profesor
     * @param agnosConsolidados El parámetro agnosConsolidados define los años consolidados que lleva el Profesor
     */
    public Profesor_CU00692B (String nombre, int edad, int agnosConsolidados) {       
        this.nombre = nombre;
        this.edad = edad;
        this.agnosConsolidados = agnosConsolidados;
    } // Cierre del constructor 2

    /**
     * Método para establecer el Nombre del Profesor
     * @param valorNombre El parámetro valorNombre define el valor que contendrá el Nombre
     */
    public void setNombre(String valorNombre) {
        nombre = valorNombre;
    } // Cierre del método para establecer el Nombre del Profesor
   
    /**
     * Método para establecer la Edad del Profesor
     * @param valorEdad El parámetro valorEdad define el valor que contendrá la Edad
     */
    public void setEdad(int valorEdad) {
        edad = valorEdad;
    } // Cierre del método para establecer la Edad del Profesor
   
    /**
     * Método para establecer los Años Consolidados del Profesor
     * @param valorAgnosConsolidados El parámetro valorAgnosConsolidados define el valor que contendrá los Años Consolidados
     */
    public void setAgnosConsolidados(int valorAgnosConsolidados) {
        agnosConsolidados = valorAgnosConsolidados;
    } // Cierre del método para establecer la Edad del Profesor
   
    /**
     * Método para para obtener la Nombre del Profesor
     * @return El Nombre del Profesor
     */
    public String getNombre(){ return nombre; }
   
     /**
     * Método para para obtener la Edad del Profesor
     * @return La Edad del Profesor
     */
    public int getEdad(){ return edad; }
   
     /**
     * Método para para obtener los Años Consolidados del Profesor
     * @return Los Años Consolidados del Profesor
     */
    public int getAgnosConsolidados(){ return agnosConsolidados; }
   
    /**
     * Método para para obtener el Salario Base del Profesor
     * @return El Salario Base del Profesor
     */
    public double obtenerSalarioBase() {
        return  725 + (agnosConsolidados * 33.25);
    } // Cierre del método para obtener el Salario Base del Profesor
   
    /**
     * Método para mostar la Información del Profesor
     */
    public void mostrarDatos() {
        System.out.println ("Nombre: " + nombre);
        System.out.println ("De: " + edad + " años");
        System.out.println ("Con: " + agnosConsolidados + " años como Profesor Consolidado");
    } // Cierre del método para mostrar información del Profesor
   
} // Cierre de la Clase


Clase Profesor Emerito:

Código: [Seleccionar]
/**EJEMPLO DE HERENCIAS, MÉTODOS POLIMÓRFICOS Y USO DE SUPER PARA LLAMAR A MÉTODOS DE SUPERCLASE.<br>
 * Esta Clase define una Subclase que "bebe" de la Superclase Profesor_CU00692B.<br>
 * Clase 2 del Ejercicio del Tema "CU00692B super invocar metodos superclases subclases java ejemplo basico".
 * @author Lorenzo Fernández Asensio
 * @version 20151201.01
 */
public class ProfesorEmerito_CU00692B extends Profesor_CU00692B {
   
    //Campo específico de la subclase.
    private int agnosEmerito;
   
     /**
     * Constructor 1 del Profesor. Atribututos sin asignación de Valores
     * @param agnosEmerito El parámetro agnosEmerito define los años que lleva como Emerito el Profesor
     */
    public ProfesorEmerito_CU00692B() {
        super();
        agnosEmerito = 0;
    } // Cierre del constructor 1
   
     /** Constructor 2 del Profesor. Atribututos con asignación de Valores
      * @param agnosEmerito El parámetro agnosEmerito define los años que lleva como Emerito el Profesor
     */
    public ProfesorEmerito_CU00692B(String nombre, int edad, int agnosConsolidados, int agnosEmerito) {
        super(nombre, edad, agnosConsolidados);
        this.agnosEmerito = agnosEmerito;
    } // Cierre del constructor 2
   
    /**
     * Método para establecer los Años que lleva el Profesor como Emerito
     * @param valorAgnosEmerito El parámetro valorAgnosEmerito define el valor de los Años como Emerito
     */
    public void setAgnosEmerito(int valorAgnosEmerito) {
        agnosEmerito = valorAgnosEmerito;
    } // Cierre del método para establecer los Años que lleva el Profesor como Emerito
   
    /**
     * Método para para obtener los Años que lleva el Profesor como Emerito
     * @return Los Años que lleva el Profesor como Emerito
     */
    public int getAgnosEmerito() { return agnosEmerito;}
   
    /**
     * Método para para obtener el Salario Base del Profesor Emerito
     * @return El Salario Base del Profesor Emerito
     */
    public double obtenerSalarioBase() {
        return super.obtenerSalarioBase() + (47.80 * agnosEmerito);
    } // Cierre del método para obtener el Salario Base del Profesor
   
    /**
     * Método para mostar la Información del Profesor Emerito
     */
    public void mostrarDatos() {
        super.mostrarDatos();
        System.out.println ("Más " + agnosEmerito + " años como Profesor Emerito");
    } // Cierre del método para mostar la Información del Profesor
   
} //Cierre de la clase


Clase Test:

Código: [Seleccionar]
/**
 * EJEMPLO DE HERENCIAS, MÉTODOS POLIMÓRFICOS Y USO DE SUPER PARA LLAMAR A MÉTODOS DE SUPERCLASE.<br>
 * Esta Clase define una clase test para probar Herencias, Polimorfismos y uso de super para métodos.<br>
 * Clase 3 del Ejercicio del Tema "CU00692B super invocar metodos superclases subclases java ejemplo basico".
 * @author Lorenzo Fernández Asensio
 * @version 20151201.01
 */
public class TestHerencia_CU00692B {

    public static void main (String [ ] Args) {
       
        // Se crea un objeto Profesor
        // y se le pasan 3 parámetros que son gestionados por el constructor de la superclase Profesor
        Profesor_CU00692B profesor1 = new Profesor_CU00692B ("Daniel", 51, 30);
       
        // Se crea un objeto Profesor Emerito
        // y se le pasan 4 parámetros. 3 son gestionados por el constructor de la superclase Profesor
        // y 1 parámetro gestionado por el cosntructor de la subclase Profesor Emerito
        Profesor_CU00692B emerito1 = new ProfesorEmerito_CU00692B("Marcos", 65, 42, 10);
       
        // Se limpia la pantalla de la Consola
        System.out.println("\f");
       
        // Mostrar Datos
        emerito1.mostrarDatos();
        System.out.println ("Y con un Sueldo Base de: " + emerito1.obtenerSalarioBase());
        System.out.println("");
        profesor1.mostrarDatos();
        System.out.println ("Y con un Sueldo Base de: " + profesor1.obtenerSalarioBase());
    } //Cierre del main
   
} //Cierre de la clase

Espero vuestras correcciones,

Muchas Gracias,

Saludos,
« Última modificación: 03 de Diciembre 2015, 08:10 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días Enzo he chequeado tu código y está muy bien. Comentarte un detalle.

En la clase de test tienes un código que es este:

Código: [Seleccionar]
        emerito1.mostrarDatos();
        System.out.println ("Y con un Sueldo Base de: " + emerito1.obtenerSalarioBase());
        System.out.println("");
        profesor1.mostrarDatos();
        System.out.println ("Y con un Sueldo Base de: " + profesor1.obtenerSalarioBase());

Te propongo que intentes trasladar las líneas donde se muestra el sueldo base a los propios métodos mostrarDatos de las clases Profesor y ProfesorEmerito.

Orientación: si incluimos System.out.println ("Y con un Sueldo Base de: " + this.obtenerSalarioBase()); en una superclase, el método estará disponible tanto para la superclase como para las subclases. ¿Qué método usará el compilador java cuando tenga que resolver si usar el método de la superclase o de la subclase, cuando sea invocado desde un objeto instanciado con tipo dinámico el de la subclase? Esto podemos resolverlo haciendo una prueba y comprobándolo

Saludos

Enzo

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 82
    • Ver Perfil
Hola Mario,

He realizado los cambios que me propones:

Superclase Profesor:
Código: [Seleccionar]
/**
 * EJEMPLO DE HERENCIAS, MÉTODOS POLIMÓRFICOS Y USO DE SUPER PARA LLAMAR A MÉTODOS DE SUPERCLASE.<br>
 * Esta Clase define una Superclase de la que "beberan" otras clases.<br>
 * Clase 1 del Ejercicio del Tema "CU00692B super invocar metodos superclases subclases java ejemplo basico".
 * @author Lorenzo Fernández Asensio
 * @version 20151201.02
 */
public class Profesor_CU00692B {

    // Inicialización de Atributos
    private String nombre;
    private int edad,
                agnosConsolidados;

    /**
     * Constructor 1 del Producto. Atribututos sin asignación de Valores
     * @param nombre El parámetro nombre define el Nombre del Profesor
     * @param edad El parámetro edad define la edad del Profesor
     * @param agnosConsolidados El parámetro agnosConsolidados define los años consolidados que lleva el Profesor
     */
    public Profesor_CU00692B () {
        nombre = "";
        edad = 0;
        agnosConsolidados = 0;
    } // Cierre del constructor 1

    /**
     * Constructor 2 del Producto. Atribututos con asignación de Valores
     * @param nombre El parámetro nombre define el Nombre del Profesor
     * @param edad El parámetro edad define la edad del Profesor
     * @param agnosConsolidados El parámetro agnosConsolidados define los años consolidados que lleva el Profesor
     */
    public Profesor_CU00692B (String nombre, int edad, int agnosConsolidados) {       
        this.nombre = nombre;
        this.edad = edad;
        this.agnosConsolidados = agnosConsolidados;
    } // Cierre del constructor 2

    /**
     * Método para establecer el Nombre del Profesor
     * @param valorNombre El parámetro valorNombre define el valor que contendrá el Nombre
     */
    public void setNombre(String valorNombre) {
        nombre = valorNombre;
    } // Cierre del método para establecer el Nombre del Profesor
   
    /**
     * Método para establecer la Edad del Profesor
     * @param valorEdad El parámetro valorEdad define el valor que contendrá la Edad
     */
    public void setEdad(int valorEdad) {
        edad = valorEdad;
    } // Cierre del método para establecer la Edad del Profesor
   
    /**
     * Método para establecer los Años Consolidados del Profesor
     * @param valorAgnosConsolidados El parámetro valorAgnosConsolidados define el valor que contendrá los Años Consolidados
     */
    public void setAgnosConsolidados(int valorAgnosConsolidados) {
        agnosConsolidados = valorAgnosConsolidados;
    } // Cierre del método para establecer la Edad del Profesor
   
    /**
     * Método para para obtener la Nombre del Profesor
     * @return El Nombre del Profesor
     */
    public String getNombre(){ return nombre; }
   
     /**
     * Método para para obtener la Edad del Profesor
     * @return La Edad del Profesor
     */
    public int getEdad(){ return edad; }
   
     /**
     * Método para para obtener los Años Consolidados del Profesor
     * @return Los Años Consolidados del Profesor
     */
    public int getAgnosConsolidados(){ return agnosConsolidados; }
   
    /**
     * Método para para obtener el Salario Base del Profesor
     * @return El Salario Base del Profesor
     */
    public double obtenerSalarioBase() {
        return  725 + (agnosConsolidados * 33.25);
    } // Cierre del método para obtener el Salario Base del Profesor
   
    /**
     * Método para mostar la Información del Profesor
     */
    public void mostrarDatos() {
        System.out.println ("Nombre: " + nombre);
        System.out.println ("De: " + edad + " años");
        System.out.println ("Con: " + agnosConsolidados + " años como Profesor Consolidado");
        System.out.println ("Y con un Sueldo Base de: " + this.obtenerSalarioBase());
    } // Cierre del método para mostrar información del Profesor
   
} // Cierre de la Clase

Subclase Profesor Emerito:
Código: [Seleccionar]
/**EJEMPLO DE HERENCIAS, MÉTODOS POLIMÓRFICOS Y USO DE SUPER PARA LLAMAR A MÉTODOS DE SUPERCLASE.<br>
 * Esta Clase define una Subclase que "bebe" de la Superclase Profesor_CU00692B.<br>
 * Clase 2 del Ejercicio del Tema "CU00692B super invocar metodos superclases subclases java ejemplo basico".
 * @author Lorenzo Fernández Asensio
 * @version 20151201.02
 */
public class ProfesorEmerito_CU00692B extends Profesor_CU00692B {
   
    //Campo específico de la subclase.
    private int agnosEmerito;
   
     /**
     * Constructor 1 del Profesor. Atribututos sin asignación de Valores
     * @param agnosEmerito El parámetro agnosEmerito define los años que lleva como Emerito el Profesor
     */
    public ProfesorEmerito_CU00692B() {
        super();
        agnosEmerito = 0;
    } // Cierre del constructor 1
   
     /** Constructor 2 del Profesor. Atribututos con asignación de Valores
      * @param agnosEmerito El parámetro agnosEmerito define los años que lleva como Emerito el Profesor
     */
    public ProfesorEmerito_CU00692B(String nombre, int edad, int agnosConsolidados, int agnosEmerito) {
        super(nombre, edad, agnosConsolidados);
        this.agnosEmerito = agnosEmerito;
    } // Cierre del constructor 2
   
    /**
     * Método para establecer los Años que lleva el Profesor como Emerito
     * @param valorAgnosEmerito El parámetro valorAgnosEmerito define el valor de los Años como Emerito
     */
    public void setAgnosEmerito(int valorAgnosEmerito) {
        agnosEmerito = valorAgnosEmerito;
    } // Cierre del método para establecer los Años que lleva el Profesor como Emerito
   
    /**
     * Método para para obtener los Años que lleva el Profesor como Emerito
     * @return Los Años que lleva el Profesor como Emerito
     */
    public int getAgnosEmerito() { return agnosEmerito;}
   
    /**
     * Método para para obtener el Salario Base del Profesor Emerito
     * @return El Salario Base del Profesor Emerito
     */
    public double obtenerSalarioBase() {
        return super.obtenerSalarioBase() + (47.80 * agnosEmerito);
    } // Cierre del método para obtener el Salario Base del Profesor
   
    /**
     * Método para mostar la Información del Profesor Emerito
     */
    public void mostrarDatos() {
        super.mostrarDatos();
        System.out.println ("Más " + agnosEmerito + " años como Profesor Emerito");
        System.out.println ("Hace un Sueldo Base Total de: " + obtenerSalarioBase());
    } // Cierre del método para mostar la Información del Profesor
   
} //Cierre de la clase

Clase Test:
Código: [Seleccionar]
/**
 * EJEMPLO DE HERENCIAS, MÉTODOS POLIMÓRFICOS Y USO DE SUPER PARA LLAMAR A MÉTODOS DE SUPERCLASE.<br>
 * Esta Clase define una clase test para probar Herencias, Polimorfismos y uso de super para métodos.<br>
 * Clase 3 del Ejercicio del Tema "CU00692B super invocar metodos superclases subclases java ejemplo basico".
 * @author Lorenzo Fernández Asensio
 * @version 20151201.02
 */
public class TestHerencia_CU00692B {

    public static void main (String [ ] Args) {
       
        // Se crea un objeto Profesor
        // y se le pasan 3 parámetros que son gestionados por el constructor de la superclase Profesor
        Profesor_CU00692B profesor1 = new Profesor_CU00692B ("Daniel", 51, 30);
       
        // Se crea un objeto Profesor Emerito
        // y se le pasan 4 parámetros. 3 son gestionados por el constructor de la superclase Profesor
        // y 1 parámetro gestionado por el cosntructor de la subclase Profesor Emerito
        Profesor_CU00692B emerito1 = new ProfesorEmerito_CU00692B("Marcos", 65, 42, 10);
       
        // Se limpia la pantalla de la Consola
        System.out.println("\f");
       
        // Mostrar Datos
        emerito1.mostrarDatos();
        System.out.println(""); // Se imprime una línea de separación en blanco
        profesor1.mostrarDatos();
    } //Cierre del main
   
} //Cierre de la clase

A tu pregunta:
Citar
¿Qué método usará el compilador java cuando tenga que resolver si usar el método de la superclase o de la subclase, cuando sea invocado desde un objeto instanciado con tipo dinámico el de la subclase?
Por lo que he visto, creo que el método que usa el compilador es el de la Subclase porque el importe que me da es directamente el total con los años de Emérito y todo. De hecho, no se como poner el código para que me haga el desglose que yo quería hacer (pesaba que al usar "this" en el método de la superclase lo haría, pero no es así).

Te pongo un ejemplo de como me sale:
Código: [Seleccionar]
Nombre: Marcos
De: 65 años
Con: 42 años como Profesor Consolidado
Y con un Sueldo Base de: 2599.5
Más 10 años como Profesor Emerito
Hace un Sueldo Base Total de: 2599.5

Nombre: Daniel
De: 51 años
Con: 30 años como Profesor Consolidado
Y con un Sueldo Base de: 1722.5

Espero tus comentarios,

Muchas gracias,

Un Saludo,

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenas tardes

Has resuelto bien el código como te había indicado.

El método que usa el compilador lo tenemos explicado en http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=660:sobreescribir-metodos-en-java-tipo-estatico-y-dinamico-ligadura-metodos-polimorficos-ejercicio-cu00690b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

Citar
el control de tipos del compilador se basa en los tipos estáticos pero en tiempo de ejecución los métodos que se ejecutan dan preferencia al tipo dinámico. Es decir, 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. Si no lo encuentra en la superclase, continúa subiendo niveles de clase hasta alcanzar a la clase Object. Si en la clase Object tampoco se encontrara un método con ese nombre, el programa no llegaría a compilar.

Es decir, si invocas un método sobre un objeto de una subclase y lo encuentra en la subclase, ese es el que ejecuta. Si no lo encuentra, lo busca en la superclase.

Sobre lo del desglose, no sé bien a qué desglose te refieres.

Saludos

Enzo

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 82
    • Ver Perfil
Hola Mario,

Muchas Gracias.

A lo que me refiero con el desglose es que, ya que hacia modificaciones, pretendía que en el caso del Profesor Emérito me hiciera un desglose poniendo primero el Sueldo Base como profesor normal y después, en la ultima línea, el Sueldo Base total (como Emérito) pero, como veras en el ejemplo que puse, al hacer la llamada al método de la subclase me pone en las dos líneas el sueldo Base total.
Y pensé que al usar "this" en el método de la superclase funcionaria, pero no es así. ¿Hay alguna forma de conseguirlo?

De nuevo, muchas gracias,

Un Saludo,

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Bueno, para eso tendrías que mantener la información en un campo adicional de la clase, o mostrar directamente el cálculo.

Ejemplo: en la clase Profesor escribir

Código: [Seleccionar]
    public void mostrarDatos() {
        System.out.println ("Nombre: " + nombre);
        System.out.println ("De: " + edad + " años");
        System.out.println ("Con: " + agnosConsolidados + " años como Profesor Consolidado");
        System.out.println ("Con sueldo de partida: " + (725 +agnosConsolidados * 33.25));
        System.out.println ("Y con un Sueldo Base de: " + this.obtenerSalarioBase());
    } // Cierre del método para mostrar información del Profesor

Saludos

Enzo

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 82
    • Ver Perfil
OK Mario,

Muchas gracias,

Un Saludo,

 

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".