🚗 Ejercicio 7 – Herencia con vehículos en Java
En este ejercicio trabajamos el concepto de herencia en Java. Primero se realiza un ejemplo con las clases Persona, Alumno y Empleado para comprender cómo funciona la herencia, los constructores y la sobrescritura de métodos. Después se desarrolla el ejercicio principal creando un sistema de vehículos con una clase base y varias clases derivadas.
👤 Ejemplo previo: Persona – Alumno – Empleado
Antes de realizar el ejercicio principal se crea una clase base llamada Persona con atributos comunes y después se crean clases hijas qué heredan de ella.
Clase Persona
package Ejercicios.ejercicio7;
public class Persona {
protected String nombre;
protected int edad;
public Persona() {
System.out.println("Se ha ejecutado el constructor vacío de Persona");
}
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
System.out.println("Ejecutando constructor con parámetros de Persona");
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
public void presentarse() {
System.out.println("Hola, soy una Persona y me llamo " + nombre);
}
}
Los atributos están declarados como protected, lo qué permite qué las clases hijas puedan acceder a ellos directamente.
Clase Alumno
package Ejercicios.ejercicio7;
public class Alumno extends Persona {
private String ciclo;
public Alumno() {
super();
}
public Alumno(String nombre, int edad, String ciclo) {
super(nombre, edad);
this.ciclo = ciclo;
}
public void estudiar() {
System.out.println(this.nombre + " está estudiando el ciclo de " + this.ciclo);
}
@Override
public void presentarse() {
super.presentarse();
System.out.println("Y además soy un Alumno del ciclo: " + ciclo);
}
}
La clase Alumno hereda de Persona.
Se utiliza super() para llamar al constructor de la clase padre
y se sobrescribe el método presentarse().
Clase Empleado
package Ejercicios.ejercicio7;
public class Empleado extends Persona {
private double salario;
public Empleado(String nombre, int edad, double salario) {
super(nombre, edad);
this.salario = salario;
}
public void mostrarDatos() {
System.out.println("Empleado: " + nombre + ", Edad: " + edad + ", Salario: " + salario);
}
}
La clase Empleado también hereda de Persona y añade su propio atributo salario.
Main de prueba
package Ejercicios.ejercicio7;
public class MainPersona {
public static void main(String[] args) {
System.out.println("--- PRUEBA ALUMNO ---");
Alumno a1 = new Alumno();
a1.nombre = "Pepe";
a1.edad = 20;
a1.presentarse();
System.out.println("\nPrueba de constructor y de super");
Alumno a2 = new Alumno("Maria", 22, "DAW");
a2.estudiar();
a2.presentarse();
System.out.println("\nPrueba de empleado");
Empleado e1 = new Empleado("Luis", 45, 2500.50);
e1.mostrarDatos();
}
}
🚗 Ejercicio principal: Sistema de vehículos
El objetivo del ejercicio es crear una jerarqué de clases qué represente distintos tipos de vehículos utilizando herencia.
Clase Vehiculo
package Ejercicios.ejercicio7;
public class Vehiculo {
protected String marca;
protected String modelo;
protected int anio;
public Vehiculo(String marca, String modelo, int anio) {
this.marca = marca;
this.modelo = modelo;
this.anio = anio;
}
public void mostrarDetalles() {
System.out.println("Vehículo: " + marca + " " + modelo + " (" + anio + ")");
}
public void mover() {
System.out.println("El vehículo se está desplazando genéricamente.");
}
}
Esta clase representa las Características comunes a todos los vehículos.
Clase Coche
package Ejercicios.ejercicio7;
public class Coche extends Vehiculo {
private int numPuertas;
public Coche(String marca, String modelo, int anio, int numPuertas) {
super(marca, modelo, anio);
this.numPuertas = numPuertas;
}
@Override
public void mostrarDetalles() {
super.mostrarDetalles();
System.out.println("Tipo: Coche, Puertas: " + numPuertas);
}
@Override
public void mover() {
System.out.println("El coche conduce por la carretera.");
}
}
Clase Motocicleta
package Ejercicios.ejercicio7;
public class Motocicleta extends Vehiculo {
private boolean tieneSidecar;
public Motocicleta(String marca, String modelo, int anio, boolean tieneSidecar) {
super(marca, modelo, anio);
this.tieneSidecar = tieneSidecar;
}
@Override
public void mostrarDetalles() {
super.mostrarDetalles();
System.out.println(" -> Tipo: Moto, ¿Tiene Sidecar?: " + (tieneSidecar ? "Sí" : "No"));
}
@Override
public void mover() {
System.out.println("La motocicleta avanza rápidamente entre el tráfico.");
}
}
Clase Camion (Extensión opcional)
package Ejercicios.ejercicio7;
public class Camion extends Vehiculo {
private double capacidadCarga;
public Camion(String marca, String modelo, int anio, double capacidadCarga) {
super(marca, modelo, anio);
this.capacidadCarga = capacidadCarga;
}
@Override
public void mostrarDetalles() {
super.mostrarDetalles();
System.out.println(" -> Tipo: Camión, Carga: " + capacidadCarga + " toneladas");
}
@Override
public void mover() {
System.out.println("El camión transporta carga pesada lentamente.");
}
}
Mainvehículos
package Ejercicios.ejercicio7;
public class Mainvehículos {
public static void main(String[] args) {
Coche miCoche = new Coche("Toyota", "Corolla", 2022, 5);
Motocicleta miMoto = new Motocicleta("Harley-Davidson", "Street 750", 2020, false);
Camion miCamion = new Camion("Volvo", "FH16", 2023, 20.5);
System.out.println("Detalles vehiculo");
miCoche.mostrarDetalles();
miMoto.mostrarDetalles();
miCamion.mostrarDetalles();
System.out.println("\nComprobando el movimiento");
miCoche.mover();
miMoto.mover();
miCamion.mover();
}
}
✅ Conclusión
Este ejercicio permite comprender mejor conceptos fundamentales de la programación Orientada a Objetos como:
- Herencia
- Sobrescritura de métodos
- Uso de
super() - Reutilización de código
- Especialización de clases
Gracias a la herencia podemos crear estructuras de código más organizadas, reutilizables y fáciles de ampliar.