Ejercicios resueltos de POO en Java: herencia, arreglos y entrada/salida

Clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 16,55 KB
Actualizado el

Resumen

El documento presenta cuatro ejercicios completos en Java que practican la Programación Orientada a Objetos: encapsulamiento, herencia, constructores, sobreescritura de métodos y manipulación de arreglos de objetos. Incluye menús interactivos con BufferedReader para gestionar préstamos, catálogos de productos, nóminas de empleados y clasificación polimórfica de productos.

Puntos clave

  • La herencia permite que una subclase como InstrumentoCuerda extienda a InstrumentoMusical reutilizando sus atributos y métodos.
  • La sobreescritura con @Override permite que mostrarDatos() tenga un comportamiento distinto en cada subclase.
  • Los arreglos de objetos, como Producto[] o Empleado[], almacenan instancias que se recorren con bucles for.
  • BufferedReader con InputStreamReader se usa para leer datos introducidos por teclado en Java.
  • El salario de un empleado se calcula según su puesto (técnico, encargado o jefe) más 30 euros por año de antigüedad.
  • El ejercicio de productos usa una jerarquía donde ProductoAlimentacion, ProductoElectronica y ProductoTextil heredan de Producto.

Resumen generado con IA a partir del documento. Ponte a prueba

Ejercicios Prácticos de Programación Orientada a Objetos en Java

A continuación se presentan cuatro ejercicios completos de Java orientados a la práctica de conceptos clave de la Programación Orientada a Objetos (POO): encapsulamiento, herencia, constructores, sobreescritura de métodos, manipulación de arreglos de objetos y gestión de entrada y salida mediante BufferedReader.

1. Sistema de Préstamo de Instrumentos Musicales

Este ejercicio implementa una jerarquía entre la clase base InstrumentoMusical y su subclase InstrumentoCuerda, junto con un menú interactivo en AplicacionPrincipal para gestionar préstamos y devoluciones.

import java.io.*;

class InstrumentoMusical {
    String nombre;
    String codigo;
    boolean siPrestado;
    String prestadoA;

    InstrumentoMusical(String n, String c) {
        nombre = n;
        codigo = c;
        siPrestado = false;
        prestadoA = "";
    }

    void prestar(String x) {
        if (!siPrestado) {
            prestadoA = x;
            siPrestado = true;
            System.out.println("El instrumento se prestó correctamente.");
        } else {
            System.out.println("El instrumento ya está prestado.");
        }
    }

    void mostrarDatos() {
        System.out.println("Nombre: " + nombre + "\nCódigo: " + codigo);
        if (siPrestado) {
            System.out.println("Prestado a: " + prestadoA);
        }
    }
}

class InstrumentoCuerda extends InstrumentoMusical {
    String tipo;

    InstrumentoCuerda(String n, String c, String t) {
        super(n, c);
        tipo = t;
    }

    @Override
    void mostrarDatos() {
        System.out.println("Nombre: " + nombre + "\nCódigo: " + codigo + "\nTipo: " + tipo);
        if (siPrestado) {
            System.out.println("Prestado a: " + prestadoA);
        }
    }

    static void mismoTipo(InstrumentoCuerda a, InstrumentoCuerda b) {
        if (a.tipo.equals(b.tipo)) {
            System.out.println("Los instrumentos son del mismo tipo.");
        } else {
            System.out.println("Los instrumentos no son del mismo tipo.");
        }
    }
}

class AplicacionPrincipal {
    public static void main(String[] args) throws IOException {
        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));
        InstrumentoMusical[] instrumentos = new InstrumentoMusical[20];
        String nombre, codigo, opcion, nombreA = "";
        char opc;
        int prestados;
        final int INFINITO = 1;

        for (int cont = 0; cont < instrumentos.length; cont++) {
            System.out.println("Introduzca nombre del instrumento:");
            nombre = lector.readLine();
            System.out.println("Introduzca código del instrumento:");
            codigo = lector.readLine();
            instrumentos[cont] = new InstrumentoMusical(nombre, codigo);
        }

        do {
            do {
                System.out.println("\n--- Menú ---");
                System.out.println("a) Prestar instrumento");
                System.out.println("b) Cancelar préstamo");
                System.out.println("c) Cuántos prestados");
                System.out.println("Introduzca la opción deseada:");
                opcion = lector.readLine();
                opc = opcion.charAt(0);
                if (!(opc == 'a' || opc == 'b' || opc == 'c')) {
                    System.out.println("Ha introducido un carácter no válido\n");
                }
            } while (!(opc == 'a' || opc == 'b' || opc == 'c'));

            switch (opc) {
                case 'a':
                    System.out.println("Introduzca nombre de usuario al que se le va a prestar:");
                    nombreA = lector.readLine();
                    System.out.println("Introduzca código de instrumento a prestar:");
                    codigo = lector.readLine();
                    for (int contadorA = 0; contadorA < instrumentos.length; contadorA++) {
                        if (instrumentos[contadorA].codigo.equals(codigo)) {
                            instrumentos[contadorA].prestar(nombreA);
                            break;
                        }
                    }
                    break;

                case 'b':
                    System.out.println("Introduzca el código del instrumento a devolver:");
                    codigo = lector.readLine();
                    for (int contadorB = 0; contadorB < instrumentos.length; contadorB++) {
                        if (instrumentos[contadorB].codigo.equals(codigo)) {
                            instrumentos[contadorB].siPrestado = false;
                            instrumentos[contadorB].prestadoA = "";
                            System.out.println("Préstamo cancelado exitosamente.");
                            break;
                        }
                    }
                    break;

                case 'c':
                    prestados = 0;
                    for (int contadorC = 0; contadorC < instrumentos.length; contadorC++) {
                        if (instrumentos[contadorC].siPrestado) {
                            prestados++;
                        }
                    }
                    System.out.println("El número de instrumentos prestados en este momento es: " + prestados);
                    break;
            }
        } while (INFINITO == 1);
    }
}

2. Gestión de Catálogo y Precios de Productos

En este bloque se define la clase Producto junto con una clase principal de menú que permite añadir nuevos artículos y consultar o actualizar sus precios en función del código identificador.

import java.io.*;

class Principal {
    public static void main(String[] args) throws IOException {
        int x = 0, contador = 0, contador_2 = 0;
        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));
        Producto[] y = new Producto[20];

        while (x != 6) {
            System.out.println("\n1. Introducir nuevo producto.");
            System.out.println("2. Mostrar datos de producto según código.");
            System.out.println("3. Modificar precio según código.");
            System.out.println("4. Modificar precio de producto según código.");
            System.out.println("5. Lista de todos los productos.");
            System.out.println("6. SALIR");
            x = Integer.parseInt(lector.readLine());

            switch (x) {
                case 1:
                    System.out.println("Introduzca el nombre:");
                    String n = lector.readLine();
                    System.out.println("Introduzca el precio:");
                    double p = Double.parseDouble(lector.readLine());
                    System.out.println("Introduzca el código:");
                    int c = Integer.parseInt(lector.readLine());
                    System.out.println("Introduzca las existencias:");
                    int e = Integer.parseInt(lector.readLine());
                    y[contador] = new Producto(n, p, c, e);
                    contador++;
                    break;

                case 2:
                    contador_2 = 0;
                    System.out.println("Introduzca el código:");
                    int comp = Integer.parseInt(lector.readLine());
                    do {
                        if (contador_2 < contador && comp == y[contador_2].codigo) {
                            System.out.println("Nombre: " + y[contador_2].nombre);
                            System.out.println("Código: " + y[contador_2].codigo);
                            System.out.println("Precio: " + y[contador_2].precio);
                            System.out.println("Existencias: " + y[contador_2].existencias);
                            contador_2 = 21;
                        } else {
                            contador_2++;
                        }
                    } while (contador_2 < 20);
                    break;

                case 3:
                    contador_2 = 0;
                    System.out.println("Introduzca el código:");
                    comp = Integer.parseInt(lector.readLine());
                    do {
                        if (contador_2 < contador && comp == y[contador_2].codigo) {
                            System.out.println("Introduzca el nuevo precio:");
                            p = Double.parseDouble(lector.readLine());
                            y[contador_2].modificarPrecio(p);
                            contador_2 = 21;
                        } else {
                            contador_2++;
                        }
                    } while (contador_2 < 20);
                    break;
            }
        }
    }
}

class Producto {
    String nombre;
    double precio;
    int codigo, existencias;

    void modificarPrecio(double p) {
        precio = p;
    }

    void modificarExistencias(int e) {
        existencias = e;
    }

    void mostrarDatos() {
        System.out.println("Nombre: " + nombre + " | Existencias: " + existencias + " | Código: " + codigo + " | Precio: " + precio);
    }

    Producto(String n, double p, int c, int e) {
        nombre = n;
        precio = p;
        codigo = c;
        existencias = e;
    }
}

3. Registro y Cálculo Salarial de Empleados

Este programa maneja una nómina simplificada mediante la clase Empleado, calculando salarios según la jerarquía del puesto (técnico, encargado, jefe) y sumando un complemento por año de antigüedad.

import java.io.*;

class Principal {
    public static void main(String[] args) throws IOException {
        String n, d, p;
        int a, cont;
        double su;
        int opcion = 0;
        Empleado[] e = new Empleado[10];
        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));

        for (cont = 0; cont < 10; cont++) {
            System.out.println("Introduzca el nombre:");
            n = lector.readLine();
            System.out.println("Introduzca el DNI:");
            d = lector.readLine();
            System.out.println("Introduzca el puesto:");
            p = lector.readLine();
            System.out.println("Introduzca los años de antigüedad:");
            a = Integer.parseInt(lector.readLine());
            e[cont] = new Empleado(n, d, p, a);
        }

        do {
            System.out.println("\n1. Mostrar datos y sueldo de un empleado.");
            System.out.println("2. Actualizar datos.");
            System.out.println("3. Salir.");
            opcion = Integer.parseInt(lector.readLine());

            if (opcion == 1) {
                System.out.println("Introduzca el DNI a buscar:");
                d = lector.readLine();
                for (cont = 0; cont < 10; cont++) {
                    if (d.equals(e[cont].dni)) {
                        su = e[cont].obtSueldo();
                        e[cont].mostrarDatos();
                        System.out.println("Sueldo: " + su);
                    }
                }
            }

            if (opcion == 2) {
                System.out.println("Introduzca el DNI a buscar:");
                d = lector.readLine();
                for (cont = 0; cont < 10; cont++) {
                    if (d.equals(e[cont].dni)) {
                        System.out.println("Introduzca el puesto:");
                        p = lector.readLine();
                        System.out.println("Introduzca los años de antigüedad:");
                        a = Integer.parseInt(lector.readLine());
                        e[cont].actualizarDatos(a, p);
                    }
                }
            }
        } while (opcion != 3);
    }
}

class Empleado {
    String nombre;
    String dni;
    String puesto;
    int antiguedad;

    double obtSueldo() {
        if (puesto.equalsIgnoreCase("tecnico")) {
            return (1000 + (30 * antiguedad));
        }
        if (puesto.equalsIgnoreCase("encargado")) {
            return (1500 + (30 * antiguedad));
        }
        if (puesto.equalsIgnoreCase("jefe")) {
            return (2000 + (30 * antiguedad));
        }
        return 0;
    }

    void mostrarDatos() {
        System.out.println("Nombre: " + nombre + " | DNI: " + dni);
    }

    void actualizarDatos(int a, String p) {
        antiguedad = a;
        p = puesto;
    }

    Empleado(String n, String d, String p, int a) {
        nombre = n;
        dni = d;
        puesto = p;
        antiguedad = a;
    }
}

4. Clasificación Polimórfica de Productos Comerciales

Muestra la aplicación de herencia múltiple a partir de la clase base Producto hacia categorías especializadas: ProductoAlimentacion, ProductoElectronica y ProductoTextil.

import java.io.*;

class Principal {
    public static void main(String[] args) throws IOException {
        Producto[] x = new Producto[3];
        int cont;
        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));

        for (cont = 0; cont < 3; cont++) {
            System.out.println("\nIntroduzca el nombre del producto:");
            String no = lector.readLine();
            System.out.println("Introduzca las existencias:");
            int ex = Integer.parseInt(lector.readLine());
            System.out.println("Introduzca el código:");
            int co = Integer.parseInt(lector.readLine());
            System.out.println("Introduzca el precio:");
            double pr = Double.parseDouble(lector.readLine());
            x[cont] = new Producto(no, ex, co, pr);

            System.out.println("Categoría:\n1. Alimentación\n2. Textil\n3. Electrónica");
            int opcion = Integer.parseInt(lector.readLine());

            if (opcion == 1) {
                System.out.println("Introduzca tipo de alimento:");
                String pro = lector.readLine();
                ProductoAlimentacion x1 = new ProductoAlimentacion(no, ex, co, pr, pro);
                x1.mostrarDatos();
            }
            if (opcion == 2) {
                System.out.println("Introduzca el tipo de material:");
                String m = lector.readLine();
                ProductoTextil x2 = new ProductoTextil(no, ex, co, pr, m);
                x2.mostrarDatos();
            }
            if (opcion == 3) {
                System.out.println("Introduzca tipo de aparato:");
                String t = lector.readLine();
                ProductoElectronica x3 = new ProductoElectronica(no, ex, co, pr, t);
                x3.mostrarDatos();
            }
        }
    }
}

class Producto {
    String nombre;
    int existencias;
    int codigo;
    double precio;

    void modificarPrecio(double p) {
        precio = p;
        System.out.println("El precio se ha modificado.");
    }

    void modificarExistencias(int e) {
        existencias = e;
        System.out.println("Las existencias se han modificado.");
    }

    void mostrarDatos() {
        System.out.println("Nombre: " + nombre + " Existencias: " + existencias);
        System.out.println("Código: " + codigo + " Precio: " + precio);
    }

    Producto(String no, int ex, int co, double pr) {
        nombre = no;
        existencias = ex;
        codigo = co;
        precio = pr;
    }
}

class ProductoAlimentacion extends Producto {
    String alimento;

    @Override
    void mostrarDatos() {
        System.out.println("Nombre: " + nombre + " Existencias: " + existencias);
        System.out.println("Código: " + codigo + " Precio: " + precio);
        System.out.println("Producto: " + alimento);
    }

    ProductoAlimentacion(String no, int ex, int co, double pr, String pro) {
        super(no, ex, co, pr);
        alimento = pro;
    }
}

class ProductoElectronica extends Producto {
    String aparato;

    @Override
    void mostrarDatos() {
        System.out.println("Nombre: " + nombre + " Existencias: " + existencias);
        System.out.println("Código: " + codigo + " Precio: " + precio);
        System.out.println("Tecnología: " + aparato);
    }

    ProductoElectronica(String no, int ex, int co, double pr, String t) {
        super(no, ex, co, pr);
        aparato = t;
    }
}

class ProductoTextil extends Producto {
    String material;

    @Override
    void mostrarDatos() {
        System.out.println("Nombre: " + nombre + " Existencias: " + existencias);
        System.out.println("Código: " + codigo + " Precio: " + precio);
        System.out.println("Material: " + material);
    }

    ProductoTextil(String no, int ex, int co, double pr, String m) {
        super(no, ex, co, pr);
        material = m;
    }
}

Preguntas frecuentes

¿Cómo se calcula el sueldo de un empleado en el ejercicio?

El método obtSueldo() devuelve 1000, 1500 o 2000 según el puesto sea técnico, encargado o jefe, y suma 30 por cada año de antigüedad. Si el puesto no coincide con ninguno, devuelve 0.

¿Para qué sirve la palabra clave extends en estos ejemplos?

Sirve para indicar que una clase hereda de otra, como class InstrumentoCuerda extends InstrumentoMusical. La subclase puede usar los atributos y métodos de la clase base.

Ponte a prueba

Tarjetas de repaso

Pulsa una tarjeta para ver la respuesta.

Test

1. ¿Qué clase es la superclase en el ejercicio de instrumentos musicales?
2. ¿Qué devuelve obtSueldo() para un empleado con puesto 'jefe' y 5 años de antigüedad?
3. ¿Qué hace la anotación @Override en mostrarDatos() de InstrumentoCuerda?
4. ¿Cuántos productos como máximo puede guardar el arreglo y del ejercicio de catálogo?
5. ¿Qué clase se usa para leer texto introducido por teclado en estos programas?
6. En el ejercicio de productos polimórficos, ¿de qué clase heredan las categorías Textil, Electrónica y Alimentación?

Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.