Publicado en Tema 5 • Herencia

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