Saltar al contenido principal

Boletín 501. Herencia

En este primer boletín trabajaremos la herencia, además de cómo conseguir con esta realizar polimorfismo.

Ejercicios

Ejercicio 1. Sigue los siguientes pasos:

  1. Crea una clase abstracta llamada Contrato con las siguientes características.
    • Necesitamos guardar el número de contrato, nombre, apellidos, salario bruto anual y su IRPF.
    • Crea los getters necesarios.
    • Crea los setters excepto para el número de contrato.
    • Crea un constructor que pida todos los atributos excepto el número de contrato. Este debe obtenerse automáticamente de manera secuencial.
    • Documenta los constructores.
    • Crea el método double getSalarioNetoAnual() que devuelva el salario neto anual.
    • Crea el método double getSalarioMensualNeto() donde divida el salario neto anual entre 12.
    • Documenta los métodos.
    • Redefine el método String toString() para que muestre los datos del contrato en el formato <numeroContrato>: <apellidos>, <nombre>. Salario mensual: <salarioMensualNeto>
  2. Crea una clase llamada ContratoIndefinido que herede de Contrato con las siguientes características.
    • Debe indicarse si las pagas extras están o no prorrateadas.
    • Crea getters y setters necesarios.
    • Redefine el constructor para incluir el nuevo atributo.
    • Documenta los constructores.
    • Redefine el método double getSalarioMensualNeto() para que calcule el salario neto mensual en función de si tiene 12 o 14 pagas al año.
    • Redefine el método String toString() para que muestre los datos del contrato en el formato Contrato Indefinido <numeroContrato>: <apellidos>, <nombre>. Salario mensual: <salarioMensualNeto>. Pagas anuales: <14/12>
  3. Crea una clase llamada ContratoTemporal que herede de Contrato con las siguientes características.
    • Debe indicarse los meses de duración del contrato. El número máximo de meses que puede durar un contrato es de 6 meses. Además, debes almacenar la fecha de inicio del contrato.
    • Crea getters y setters necesarios.
    • Redefine el constructor para incluir los nuevos atributos. La fecha de inicio del contrato debe ir como una cadena de texto en el siguiente formato dd/MM/yyyy.
    • Documenta los constructores.
    • Crea el método String getFinContrato() que devuelva la fecha de fin de contrato en el siguiente formato de texto dd/MM/yyyy.
    • Redefine el método double getSalarioMensualNeto() para que calcule el salario neto mensual en función de los meses de duración del contrato.
    • Documenta los métodos.
    • Redefine el método String toString() para que muestre los datos del contrato en el formato Contrato Temporal <numeroContrato>: <apellidos>, <nombre>. Salario mensual: <salarioMensualNeto>. Contratado desde <fechaInicioContrato> hasta <fechaFinContrato>
  4. Crea una clase llamada ContratoEnPracticas que herede de Contrato con las siguientes características.
    • Debe almacenarse la titulación que está estudiando el trabajador en prácticas.
    • Crea getters y setters necesarios.
    • Redefine el constructor para incluir el nuevo atributo.
    • Documenta los constructores.
    • Redefine el método String toString() para que muestre los datos del contrato en el formato Contrato En Prácticas <numeroContrato>: <apellidos>, <nombre>. Salario mensual: <salarioMensualNeto>. Titulación: <titulacion>
  5. Realiza el siguiente programa principal:
    • Crea un ArrayList para almacenar todos los contratos.
    • Crea un contrato indefinido con los siguientes datos y guárdalo en el ArrayList:
      • Nombre y Apellidos: Charles Foster Kane
      • Salario Anual Bruto: 35.000 €
      • IRPF: 18%
      • 14 pagas
    • Crea un contrato indefinido con los siguientes datos y guárdalo en el ArrayList:
      • Nombre y Apellidos: Rick Blaine
      • Salario Anual Bruto: 60.000 €
      • IRPF: 25%
      • 12 pagas
    • Crea un contrato temporal con los siguientes datos y guárdalo en el ArrayList:
      • Nombre y Apellidos: Cool Hand Luke
      • Salario Anual Bruto: 10.000 €
      • IRPF: 6%
      • 4 meses de contrato
      • Inicio de contrato: 12 de enero de 2025.
    • Crea un contrato en prácticas con los siguientes datos y guárdalo en el ArrayList:
      • Nombre y Apellidos: Harrison Smith
      • Salario Anual Bruto: 15.000 €
      • IRPF: 2%
      • Titulación: Desarrollo de Aplicaciones Web
    • Utiliza el polimorfismo y recorre el ArrayList e imprime los datos de cada contrato utilizando el método toString().

Ejercicio 2. Sigue los siguientes pasos:

  1. Crea una clase abstracta llamada Deportista con las siguientes características.
    • Necesitamos guardar su nombre completo, el nombre por el que es conocido popularmente y su fecha de nacimiento.
    • Crea getters y setters necesarios.
    • Crea un constructor que pida todos los atributos con la fecha en formato dd/MM/yyyy.
    • Documenta los constructores.
    • Crea el método int getIdade() que devuelva la edad del deportista.
    • Documenta los métodos.
    • Redefine el método String toString() para que muestre los datos del deportista en el formato <nombrePopular> : <edad> años.
  2. Crea una clase llamada Tenista que herede de Deportista con las siguientes características.
    • Debe indicarse su número en el ranking mundial de tenis.
    • Crea getters y setters necesarios.
    • Redefine el constructor para incluir el nuevo atributo.
    • Documenta los constructores.
    • Redefine el método String toString() para que muestre los datos del tenista en el formato Tenista: <nombrePopular> : <edad> años. Nº <posicionRanking> del mundo.
  3. Crea una clase abstracta llamada Piloto que herede de Deportista con las siguientes características.
    • Debe indicarse su nombre de equipo.
    • Crea getters y setters necesarios.
    • Redefine el constructor para incluir el nuevo atributo.
    • Documenta los constructores.
    • Crea el método abstracto double getPuntos() que devuelva el número de puntos.
    • Documenta los métodos.
    • Redefine el método String toString() para que muestre los datos del piloto en el formato <nombrePopular> : <edad> años. Equipo: <equipo> - Puntos: <puntos>
  4. Crea una clase llamada PilotoF1 que herede de Piloto con las siguientes características.
    • Debe indicarse su número de victorias totales, vueltas rápidas y pole positions.
    • Crea getters y setters necesarios.
    • Redefine el constructor para incluir los nuevos atributos.
    • Documenta los constructores.
    • Redefine el método double getPuntos() que devuelva el número de puntos. Cada victoria son 25 puntos, cada vuelta rápida es 1 punto y cada pole position son 5 puntos.
  5. Crea una clase llamada PilotoMotoGP que herede de Piloto con las siguientes características.
    • Debe indicarse el número total de puntos.
    • Redefine el constructor para incluir los nuevos atributos.
    • Documenta los constructores.
    • Redefine el método double getPuntos() que devuelva el número de puntos.
  6. Realiza el siguiente programa principal:
    • Crea un ArrayList para almacenar todos los deportistas.
    • Crea un ArrayList para almacenar todos los tenistas.
    • Crea un ArrayList para almacenar todos los pilotos.
    • Crea un ArrayList para almacenar todos los pilotos de Fórmula 1.
    • Crea un ArrayList para almacenar todos los pilotos de MotoGP.
    • Crea un tenista con los siguientes datos y guárdalo en el ArrayList de deportistas y tenistas:
      • Nombre y Apellidos: Carlos Jonás Alcaraz
      • Nombre por el que es conocido: Carlos Alcaraz
      • Fecha de nacimiento: 23 de mayo de 2003
      • Ranking mundial: 3º
    • Crea un tenista con los siguientes datos y guárdalo en el ArrayList de deportistas y tenistas:
      • Nombre y Apellidos: Novak Djokovic
      • Nombre por el que es conocido: Djokovic
      • Fecha de nacimiento: 22 de mayo de 1987
      • Ranking mundial: 2º
    • Crea un piloto de Fórmula 1 con los siguientes datos y guárdalo en el ArrayList de deportistas, pilotos y pilotos de F1:
      • Nombre y Apellidos: Fernando Alonso Díaz
      • Nombre por el que es conocido: Fernando Alonso
      • Fecha de nacimiento: 29 de julio de 1981
      • Equipo: Aston Martin
      • Victorias: 33
      • Vueltas rápidas: 26
      • Pole Positions: 22
    • Crea un piloto de Fórmula 1 con los siguientes datos y guárdalo en el ArrayList de deportistas, pilotos y pilotos de F1:
      • Nombre y Apellidos: Max Emilian Verstappen
      • Nombre por el que es conocido: Verstappen
      • Fecha de nacimiento: 30 de septiembre de 1997
      • Equipo: Red Bull Racing
      • Victorias: 62
      • Vueltas rápidas: 33
      • Pole Positions: 40
    • Crea un piloto de MotoGP con los siguientes datos y guárdalo en el ArrayList de deportistas, pilotos y pilotos de MotoGP:
      • Nombre y Apellidos: Marc Márquez Alentà
      • Nombre por el que es conocido: Marc Márquez
      • Fecha de nacimiento: 17 de febrero de 1993
      • Equipo: Grenesi Racing
      • Puntos: 102
    • Crea un piloto de MotoGP con los siguientes datos y guárdalo en el ArrayList de deportistas, pilotos y pilotos de MotoGP:
      • Nombre y Apellidos: Francesco Bagnaia
      • Nombre por el que es conocido: Bagnaia
      • Fecha de nacimiento: 14 de enero de 1997
      • Equipo: Ducati Lenovo Team
      • Puntos: 461
    • Utiliza el polimorfismo y recorre el ArrayList de deportistas e imprime los datos de cada deportista con toString().
    • Utiliza el polimorfismo y recorre el ArrayList de pilotos e imprime los datos de cada piloto con toString().
    • Recorre el ArrayList de tenistas e imprime los datos de cada tenista con toString().
    • Recorre el ArrayList de pilotos de Fórmula 1 e imprime los datos de cada piloto de Fórmula 1 con toString().
    • Recorre el ArrayList de pilotos de MotoGP e imprime los datos de cada piloto de MotoGP con toString().

Ejercicio 3. Crea un programa con el siguiente menú principal:

import java.util.ArrayList;

public class App {
public static void main(String[] args) throws Exception {

// Estructuras de datos
ArrayList<Producto> productos = new ArrayList<Producto>();
ArrayList<Componente> componentes = new ArrayList<Componente>();
ArrayList<Periferico> perifericos = new ArrayList<Periferico>();
ArrayList<Procesador> procesadores = new ArrayList<Procesador>();
ArrayList<PlacaBase> placasbase = new ArrayList<PlacaBase>();
ArrayList<MemoriaRam> memorias = new ArrayList<MemoriaRam>();
ArrayList<Monitor> monitores = new ArrayList<Monitor>();
ArrayList<Teclado> teclados = new ArrayList<Teclado>();

// Procesadores
Procesador amd = new Procesador("AMD", "7600X", 219.99, Zocalo.AM5, 6);
Procesador intel = new Procesador("Intel", "i5-12400F", 117.99, Zocalo.LGA1700, 6);
productos.add(amd);
productos.add(intel);
componentes.add(amd);
componentes.add(intel);
procesadores.add(amd);
procesadores.add(intel);

// Placas base
PlacaBase msi = new PlacaBase("MSI", "MAG B650 TOMAHAWK", 189.99, Zocalo.AM5);
PlacaBase asus = new PlacaBase("ASUS", "PRIME B760-PLUS", 125.99, Zocalo.LGA1700);
productos.add(msi);
productos.add(asus);
componentes.add(msi);
componentes.add(asus);
placasbase.add(msi);
placasbase.add(asus);

//Memorias RAM
MemoriaRam acer = new MemoriaRam("ACER", "Predator Vesta II", 125.99, 6, 16);
MemoriaRam corsair = new MemoriaRam("Corsair", "Corsair Vengeance", 139.98, 6.4, 16);
productos.add(acer);
productos.add(corsair);
componentes.add(acer);
componentes.add(corsair);
memorias.add(acer);
memorias.add(corsair);

//Monitores
Monitor alurin = new Monitor("Alurin", "CoreVision", 84.99, 23.8);
alurin.addConector(Conector.HDMI);
alurin.addConector(Conector.VGA);
Monitor aoc = new Monitor("AOC", "C27G4ZXE", 169.99, 27);
aoc.addConector(Conector.DisplayPort);
productos.add(alurin);
productos.add(aoc);
perifericos.add(alurin);
perifericos.add(aoc);
monitores.add(alurin);
monitores.add(aoc);

// Teclados
Teclado pccom = new Teclado("PcCom", "Essential Combo Low Profile", 13.99);
pccom.addConector(Conector.USB);
Teclado tempest = new Teclado("Tempest", "Oblivion", 25.39);
tempest.addConector(Conector.PS2);
productos.add(pccom);
productos.add(tempest);
perifericos.add(pccom);
perifericos.add(tempest);
teclados.add(pccom);
teclados.add(tempest);

//Imprimimos las listas
App.imprimirLista(productos);
App.imprimirLista(componentes);
App.imprimirLista(perifericos);
App.imprimirLista(procesadores);
App.imprimirLista(placasbase);
App.imprimirLista(memorias);
App.imprimirLista(monitores);
App.imprimirLista(teclados);
}

private static <E> void imprimirLista(ArrayList<E> lista) {
for(E obj: lista){
System.out.println(obj);
}
System.out.println("----------");
}

}

Utiliza este modelo de clases realizado en UML para implementar dicha aplicación:

La salida del programa debería ser la siguiente:

Procesador AMD 7600X: 219.99€ con 6 y socket AM5
Procesador Intel i5-12400F: 117.99€ con 6 y socket LGA1700
Placa Base MSI MAG B650 TOMAHAWK: 189.99€ con socket AM5
Placa Base ASUS PRIME B760-PLUS: 125.99€ con socket LGA1700
Memoria RAM ACER Predator Vesta II: 125.99€ con 16.0 GB y velocidad 6000.0 MHz
Memoria RAM Corsair Corsair Vengeance: 139.98€ con 16.0 GB y velocidad 6400.0 MHz
Monitor Alurin CoreVision: 84.99€ con 23.8 pulgadas y conectores: HDMI VGA
Monitor AOC C27G4ZXE: 169.99€ con 27.0 pulgadas y conectores: DisplayPort
Teclado PcCom Essential Combo Low Profile: 13.99€ con conectores: USB
Teclado Tempest Oblivion: 25.39€ con conectores: PS2
----------
Procesador AMD 7600X: 219.99€ con 6 y socket AM5
Procesador Intel i5-12400F: 117.99€ con 6 y socket LGA1700
Placa Base MSI MAG B650 TOMAHAWK: 189.99€ con socket AM5
Placa Base ASUS PRIME B760-PLUS: 125.99€ con socket LGA1700
Memoria RAM ACER Predator Vesta II: 125.99€ con 16.0 GB y velocidad 6000.0 MHz
Memoria RAM Corsair Corsair Vengeance: 139.98€ con 16.0 GB y velocidad 6400.0 MHz
----------
Monitor Alurin CoreVision: 84.99€ con 23.8 pulgadas y conectores: HDMI VGA
Monitor AOC C27G4ZXE: 169.99€ con 27.0 pulgadas y conectores: DisplayPort
Teclado PcCom Essential Combo Low Profile: 13.99€ con conectores: USB
Teclado Tempest Oblivion: 25.39€ con conectores: PS2
----------
Procesador AMD 7600X: 219.99€ con 6 y socket AM5
Procesador Intel i5-12400F: 117.99€ con 6 y socket LGA1700
----------
Placa Base MSI MAG B650 TOMAHAWK: 189.99€ con socket AM5
Placa Base ASUS PRIME B760-PLUS: 125.99€ con socket LGA1700
----------
Memoria RAM ACER Predator Vesta II: 125.99€ con 16.0 GB y velocidad 6000.0 MHz
Memoria RAM Corsair Corsair Vengeance: 139.98€ con 16.0 GB y velocidad 6400.0 MHz
----------
Monitor Alurin CoreVision: 84.99€ con 23.8 pulgadas y conectores: HDMI VGA
Monitor AOC C27G4ZXE: 169.99€ con 27.0 pulgadas y conectores: DisplayPort
----------
Teclado PcCom Essential Combo Low Profile: 13.99€ con conectores: USB
Teclado Tempest Oblivion: 25.39€ con conectores: PS2
----------

Notas:

  • Fíjate bien en qué unidades se pasan las características como parámetro y en qué unidades se almacenan los atributos.
  • En Producto, dos productos se consideran iguales cuando tienen la misma marca y modelo.
  • En el diagrama, los métodos subrayados indican que son métodos estáticos.
  • En los atributos y métodos, el símbolo - significa private, + significa public y por último # significa protected.