Autor Tema: Java diferencia entre tipo estático y tipo dinámico Clases abstractas CU00695B  (Leído 3383 veces)

Enzo

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

Aquí dejo mi ejercicio del Tema "CU00695B clases abstractas java métodos abstract class api ejemplo ejercicio" para su corrección:

Superclase Persona:
Código: [Seleccionar]
/**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Superclase de la que "beberan" otras clases.<br>
 * Clase 1 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
public class Persona_CU00695B {

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

    /**
     * Constructor 1 del Producto - Atribututos sin asignación de Valores
     * @param nombre El parámetro nombre define el Nombre de la Persona
     * @param apellidos El parámetro apellidos define los Apellidos de la Persona
     * @param edad El parámetro edad define la edad de la Persona
     */
    public Persona_CU00695B() {
        nombre = "";
        apellidos = "";
        edad = 0;
    } // Cierre del constructor 1

    /**
     * Constructor 2 del Producto - Atribututos con asignación de Valores
     * @param nombre El parámetro nombre define el Nombre de la Persona
     * @param apellidos El parámetro apellidos define los Apellidos de la Persona
     * @param edad El parámetro edad define la edad de la Persona
     */
    public Persona_CU00695B (String nombre, String apellidos, int edad) {
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.edad = edad;
    } // Cierre del constructor 2

    /**
     * Método para para obtener la Nombre de la Persona
     * @return El Nombre de la Persona
     */
    public String getNombre() {return nombre;}

    /**
     * Método para para obtener los Apellidos de la Persona
     * @return Los Apellidos de la Persona
     */
    public String getApellidos() {return apellidos;}

    /**
     * Método para para obtener la Edad de la Persona
     * @return La Edad de la Persona
     */
    public int getEdad() {return edad;}

    /**
     * Método para para obtener los datos de la Persona
     * @return Los datos de la Persona
     */
    public String toString() {
        /* Se transforma edad en un Integer para poder aplicarle el método toString().
         * De otra manera no se puede hacer por ser edad un tipo primitivo.*/
        Integer datoEdad = edad;
        // Se devuelve uns String con los datos de la Persona
        return "- ".concat(nombre).concat(" ").concat(apellidos)
        .concat(" de ").concat(datoEdad.toString().concat(" años,") );
    } // Cierre del método para para obtener los datos de la Persona
   
} //Cierre de la clase

Subclase Abstracta Legislador:
Código: [Seleccionar]
/**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Subclase Abstracta que "bebe" de la Superclase Persona_CU00695B.<br>
 * Clase 2 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
public abstract class Legislador_CU00695B extends Persona_CU00695B {

    // Campos específicos de la subclase.
    private String provinciaQueRepresenta,
                    idLegislador;
    int antiguedad;

    /**
     * Constructor 1 del Profesor - Atribututos sin asignación de Valores
     * @param provinciaQueRepresenta El parámetro provinciaQueRepresenta define la Provincia a la que representa el Legislador
     * @param idLegislador El parámetro idLegislador define el Cod. Identificativo del Legislador
     * @param antiguedad El parámetro antiguedad define los años de antiguedad del Legislador
     */
    public Legislador_CU00695B () {
        super();
        provinciaQueRepresenta = "";
        idLegislador = "";
        antiguedad = 0;
    } // Cierre del constructor 1

    /**
     * Constructor 2 del Profesor - Atribututos con asignación de Valores
     * @param provinciaQueRepresenta El parámetro provinciaQueRepresenta define la Provincia a la que representa el Legislador
     * @param idLegislador El parámetro idLegislador define el Cod. Identificativo del Legislador
     * @param antiguedad El parámetro antiguedad define los años de antiguedad del Legislador
     */
    public Legislador_CU00695B (String nombre, String apellidos, int edad, String provinciaQueRepresenta,String idLegislador, int antiguedad) {
        super(nombre, apellidos, edad);
        this.provinciaQueRepresenta = provinciaQueRepresenta;
        this.idLegislador = idLegislador;
        this.antiguedad = antiguedad;
    } // Cierre del constructor 2

    // METODOS ESPECIFICOS DE LA SUBLASE
    /** Método para establecer la Provincia Que Representa el Legislador
     * @param provinciaQueRepresenta El parámetro provinciaQueRepresenta define el valor que contendrá la Provincia Que Representa el Legislador
     */
    public void setProvinciaQueRepresenta (String provinciaQueRepresenta) {this.provinciaQueRepresenta = provinciaQueRepresenta;}
   
    /** Método para establecer el id del Legislador
     * @param idLegislador El parámetro idLegislador define el valor que contendrá el Cod. Identificativo del Legislador
     */
    public void setIdLegislador (String idLegislador) {this.idLegislador = idLegislador;}
   
    /** Método para establecer la Antiguedad del Legislador
     * @param antiguedad El parámetro antiguedad define el valor que contendrá la Antiguedad del Legislador
     */
    public void setAntiguedad (int antiguedad) {this.antiguedad = antiguedad;}
   
    /** Método para obtener la Provincia Que Representa el Legislador
     * @return La provincia a la que representa el Legislador
     */
    public String getProvinciaQueRepresenta() {return provinciaQueRepresenta;}
   
    /** Método para obtener el id del Legislador
     * @return El Código Identificativo del Legislador
     */
    public String getIdLegislador() {return idLegislador;}
   
    /** Método para obtener la Antiguedad del Legislador
     * @return La antiguedad del Legislador
     */
    public int getAntiguedad() {return antiguedad;}
   
    /**
     * Método Abstracto para la camara en la que trabaja el Legislador
     */
    // Método abstracto (definido como abstract y sin cuerpo)
    abstract public String getCamaraEnQueTrabaja();
   
    /**
     * Método para para obtener los datos del Legislador
     * @return Los datos del Legislador
     */
    public String toString () {
        /* Se transforma antiguedad en un Integer para poder aplicarle el método toString().
         * De otra manera no se puede hacer por ser antiguedad un tipo primitivo.*/
        Integer datoAntiguedad = antiguedad;
        // Se devuelve uns String con los datos de Persona + los de Legislador
        return super.toString().concat(" con Cod. identificativo ").concat(idLegislador)
        .concat(" y con ").concat(datoAntiguedad.toString().concat(" años representando a la Provincia de ").concat(provinciaQueRepresenta));
    }// Cierre del método para obtener los datos del Profesor

} //Cierre de la clase

Subclase Diputado:
Código: [Seleccionar]
/**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Subclase que "bebe" de la Superclase Legislador_CU00695B.<br>
 * Clase 3 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
public class Diputado_CU00695B extends Legislador_CU00695B {
   
    // No hay campos específicos de la subclase.
   
    /**
     * Constructor 1 del Diputado - Atribututos sin asignación de Valores
     */
    public Diputado_CU00695B () {
        super();
    } // Cierre del constructor 1

    /**
     * Constructor 2 del Diputado - Atribututos con asignación de Valores
     */
    public Diputado_CU00695B (String nombre, String apellidos, int edad, String provinciaQueRepresenta,String idLegislador, int antiguedad) {
        super(nombre, apellidos, edad, provinciaQueRepresenta, idLegislador, antiguedad);
    } // Cierre del constructor 2
   
    /**
     * Método Abstracto que redefine (obligatoriamente han de hacerlo) el método abstracto getCamaraEnQueTrabaja() de la superclase.
     * @return En que Cámara trabaja el Diputado
     */
    public String getCamaraEnQueTrabaja() { return " en la Cámara del Congreso.";} //Método abstracto sobreescrito en esta clase
   
    /**
     * Método para para obtener los datos del Diputado
     * @return Los datos del Diputado
     */
    public String toString () { // Sobreescritura del método
        return super.toString().concat (getCamaraEnQueTrabaja());}

} //Cierre de la clase

Subclase Senador:
Código: [Seleccionar]
/**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Subclase que "bebe" de la Superclase Legislador_CU00695B.<br>
 * Clase 4 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
public class Senador_CU00695B extends Legislador_CU00695B {
   
    // No hay campos específicos de la subclase.
   
    /**
     * Constructor 1 del Senador - Atribututos sin asignación de Valores
     */
    public Senador_CU00695B () {
        super();
    } // Cierre del constructor 1

    /**
     * Constructor 2 del Senador - Atribututos con asignación de Valores
     */
    public Senador_CU00695B (String nombre, String apellidos, int edad, String provinciaQueRepresenta,String idLegislador, int antiguedad) {
        super(nombre, apellidos, edad, provinciaQueRepresenta, idLegislador, antiguedad);
    } // Cierre del constructor 2
   
    /**
     * Método Abstracto que redefine (obligatoriamente han de hacerlo) el método abstracto getCamaraEnQueTrabaja() de la superclase.
     * @return En que Cámara trabaja el Senador
     */
    public String getCamaraEnQueTrabaja() { return " en la Cámara del Senado.";} //Método abstracto sobreescrito
   
    /**
     * Método para para obtener los datos del Senador
     * @return Los datos del Senador
     */
    public String toString () { // Sobreescritura del método
        return super.toString().concat (getCamaraEnQueTrabaja());}

} //Cierre de la clase

Clase Lista Legisladores:
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;

/**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Subclase que "bebe" de las Superclases intermedias de tipos de Legisladores.<br>
 * Clase 5 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
public class ListaLegisladores_CU00695B {
   
    // Inicialización de la Colección
    private ArrayList <Legislador_CU00695B> listaLegisladores; //Campo de la clase
   
    /**
     * Constructor de la Colección Lista de Legisladores.
     * @param listaLegisladores El parámetro listaLegisladores define la colección de la Lista de Legisladores
     */
    public ListaLegisladores_CU00695B () {
        // Creación de la Colección
        listaLegisladores = new ArrayList <Legislador_CU00695B> ();
    } // Cierre del Constructor
   
    /**
     * Método para añadir un legislador a la Colección
     * @param legisladorNuevo El parámetro legisladorNuevo define el Legislador que se añade a la Colección
     */
    public void addLegislador (Legislador_CU00695B legisladorNuevo) {
        listaLegisladores.add(legisladorNuevo);
    } // Cierre del método para añadir un legislador a la Colección
   
    /**
     * Método para mostrar por pantalla la Información usando un For Extendido
     */
    public void imprimirListado() {
       
        // Se limpia la pantalla de la Consola
        System.out.println("\f");
       
        // Se Muestra en pantalla un mensaje de Inicio
        System.out.println ("En la actualidad, tenemos los siguientes Legisladores:");
       
        // Se recorre la lista mostrando los datos
        for (Legislador_CU00695B tmp: listaLegisladores) {
            // Se realiza una llamada al método "toString" del objeto en curso
            System.out.println (tmp.toString());
        }
       
    } //Cierre método imprimirListin
   
} //Cierre de la clase

Clase Test:
Código: [Seleccionar]
/**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una clase test para probar Herencias y Clase & Métodos Abstractos.<br>
 * Clase 6 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
public class TestAbstractLegis_CU00695B {

    public static void main (String [ ] Args) {
       
       
        // Creación de varios Diputados
        Diputado_CU00695B Diputado1 = new Diputado_CU00695B ("Adrian", "De las Heras Cortes", 57, "Barcelona", "BAR-35752", 7);
        Diputado_CU00695B Diputado2 = new Diputado_CU00695B ("Celia", "Jimenez Ladrillo", 63, "Sevilla", "SEV-7841", 14);
        Diputado_CU00695B Diputado3 = new Diputado_CU00695B ("Felix", "Garcia Trujillo", 58, "Badajoz", "BAD-459", 3);
       
        // Creación de varios Senadores
        Senador_CU00695B senador1 = new Senador_CU00695B ("Maria de la O", "Abellan Ruiz", 46, "Salamanca", "BSAL-4978", 1);
        Senador_CU00695B senador2 = new Senador_CU00695B ("Ramón", "Guitarra Espada", 69, "Murcia", "MUR-1599", 8);
        Senador_CU00695B senador3 = new Senador_CU00695B ("Margarita", "Sanchez Raspa", 51, "Huelva", "HUE-1994", 5);
       
        // Creación de un objeto Lista de Legisladores
        ListaLegisladores_CU00695B listaLegisladores = new ListaLegisladores_CU00695B ();
       
        // Se Añaden a la lista los Diputados
        listaLegisladores.addLegislador(Diputado1);
        listaLegisladores.addLegislador(Diputado2);
        listaLegisladores.addLegislador(Diputado3);
       
        // Se Añaden al listin los Senadores
        listaLegisladores.addLegislador(senador1);
        listaLegisladores.addLegislador(senador2);
        listaLegisladores.addLegislador(senador3);
       
        // Se realiza llamada al método "imprimirListado" de la clase "listaLegisladores" para imprimirlo
        listaLegisladores.imprimirListado();
           
    } // Cierre del main

} // Cierre de la clase

Como siempre, espero vuestros comentarios.

Muchas Gracias,

Un Saludo,
« Última modificación: 11 de Diciembre 2015, 08:36 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola Enzo

Bien comentado, buen uso de la sobreescritura de toString con invocaciones a superclase, bien los constructores en las subclases, bien el uso del método declarado abstracto...

Realmente no hacía falta crear una clase ListaLegisladores para resolver el ejercicio (podía hacerse creándola simplemente dentro del método con el main como se hace en https://www.aprenderaprogramar.com/foros/index.php?topic=2961.0

Para hacer uso del polimorfismo se recomienda declarar siempre los tipos estáticos de la superclase, clase abstracta o interface ("lo más amplio") y el tipo dinámico de la clase concreta. Por ejemplo:

Legislador_CU00695B Diputado1 = new Diputado_CU00695B ("Adrian", "De las Heras Cortes", 57, "Barcelona", "BAR-35752", 7);

Donde el tipo estático es Legislador y el tipo dinámico Diputado. El objeto tiene así los dos tipos y por eso decimos que existe polimorfismo (varias formas del mismo objeto). Prueba a cambiar los tipos estáticos, verás que te funciona igualmente.

Saludos

Enzo

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

OK. Tienes razón con lo que me comentas:
Citar
Para hacer uso del polimorfismo se recomienda declarar siempre los tipos estáticos de la superclase, clase abstracta o interface ("lo más amplio") y el tipo dinámico de la clase concreta. Por ejemplo:

Legislador_CU00695B Diputado1 = new Diputado_CU00695B ("Adrian", "De las Heras Cortes", 57, "Barcelona", "BAR-35752", 7);

Y no eres el primero en decírmelo.
Lo que ocurre es que por defecto tiendo siempre, al escribir el código, a hacerlo usando la subclase (con la idea de cambiarlo cuando tenga terminado y probado todo) y al final se me olvida cambiarlo.

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