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:
- Crea una clase abstracta llamada
Contratocon 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>
- Crea una clase llamada
ContratoIndefinidoque herede deContratocon 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 formatoContrato Indefinido <numeroContrato>: <apellidos>, <nombre>. Salario mensual: <salarioMensualNeto>. Pagas anuales: <14/12>
- Crea una clase llamada
ContratoTemporalque herede deContratocon 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 textodd/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 formatoContrato Temporal <numeroContrato>: <apellidos>, <nombre>. Salario mensual: <salarioMensualNeto>. Contratado desde <fechaInicioContrato> hasta <fechaFinContrato>
- Crea una clase llamada
ContratoEnPracticasque herede deContratocon 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 formatoContrato En Prácticas <numeroContrato>: <apellidos>, <nombre>. Salario mensual: <salarioMensualNeto>. Titulación: <titulacion>
- Realiza el siguiente programa principal:
- Crea un
ArrayListpara 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
ArrayListe imprime los datos de cada contrato utilizando el métodotoString().
- Crea un
Ejercicio 2. Sigue los siguientes pasos:
- Crea una clase abstracta llamada
Deportistacon 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.
- Crea una clase llamada
Tenistaque herede deDeportistacon 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 formatoTenista: <nombrePopular> : <edad> años. Nº <posicionRanking> del mundo.
- Crea una clase abstracta llamada
Pilotoque herede deDeportistacon 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>
- Crea una clase llamada
PilotoF1que herede dePilotocon 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.
- Crea una clase llamada
PilotoMotoGPque herede dePilotocon 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.
- Realiza el siguiente programa principal:
- Crea un
ArrayListpara almacenar todos los deportistas. - Crea un
ArrayListpara almacenar todos los tenistas. - Crea un
ArrayListpara almacenar todos los pilotos. - Crea un
ArrayListpara almacenar todos los pilotos de Fórmula 1. - Crea un
ArrayListpara almacenar todos los pilotos de MotoGP. - Crea un tenista con los siguientes datos y guárdalo en el
ArrayListde 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
ArrayListde 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
ArrayListde 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
ArrayListde 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
ArrayListde 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
ArrayListde 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
ArrayListde deportistas e imprime los datos de cada deportista contoString(). - Utiliza el polimorfismo y recorre el
ArrayListde pilotos e imprime los datos de cada piloto contoString(). - Recorre el
ArrayListde tenistas e imprime los datos de cada tenista contoString(). - Recorre el
ArrayListde pilotos de Fórmula 1 e imprime los datos de cada piloto de Fórmula 1 contoString(). - Recorre el
ArrayListde pilotos de MotoGP e imprime los datos de cada piloto de MotoGP contoString().
- Crea un
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
-significaprivate,+significapublicy por último#significaprotected.