Laboratorio 03 — Encapsulamiento y Modificadores de Acceso - jorgealbertopineda78-del/java GitHub Wiki

Laboratorio 03 — Encapsulamiento y Modificadores de Acceso

Unidad: 3 — Encapsulamiento y Modificadores de Acceso Duración estimada: 90 minutos Nivel: Básico-Intermedio


Objetivo

Aplicar el principio de encapsulamiento en Java usando modificadores de acceso (public, private, protected), métodos getter y setter, y validaciones básicas dentro de los setters para proteger el estado de los objetos.


Contexto del problema

Eres parte del equipo de desarrollo de una empresa de transporte multimodal. El sistema necesita registrar distintos tipos de vehículos: automóviles, aviones y barcos. Cada vehículo tiene datos sensibles (como velocidad máxima y capacidad) que no deben modificarse sin validación.

Tu tarea es modelar la jerarquía de clases aplicando encapsulamiento correcto en cada una.


Diagrama UML

┌──────────────────────────────────────┐
│               Vehiculo               │
├──────────────────────────────────────┤
│ - marca        : String              │
│ - modelo       : String              │
│ - anio         : int                 │
│ # velocidadMax : double              │
├──────────────────────────────────────┤
│ + Vehiculo(marca, modelo, anio,      │
│            velocidadMax)             │
│ + getMarca()        : String         │
│ + getModelo()       : String         │
│ + getAnio()         : int            │
│ + getVelocidadMax() : double         │
│ + setAnio(int)      : void           │
│ + setVelocidadMax(double) : void     │
│ + describir()       : void           │
│ + toString()        : String         │
└──────────────────┬───────────────────┘
                   │
          ┌────────┴────────┐
          │                 │
          ▼                 ▼
┌─────────────────┐   ┌──────────────────────┐
│   Automovil     │   │   (tus clases aquí)  │
├─────────────────┤   │   Avion / Barco      │
│ - numPuertas: int│   └──────────────────────┘
│ - esElectrico:  │
│   boolean       │
├─────────────────┤
│ + Automovil(...)│
│ + getNumPuertas │
│ + isElectrico() │
│ + setNumPuertas │
│ + toString()    │
└─────────────────┘

Nota: velocidadMax usa modificador protected — ¿por qué crees que es diferente a private? Discútelo con tu equipo.


Instrucciones

Parte 1 — Clase Vehiculo (se construye en clase con el profesor)

Crea Vehiculo.java con lo siguiente:

  1. Declara los atributos:

    • marca y modelo → private
    • anio → private
    • velocidadMax → protected (las subclases podrán accederlo directamente)
  2. Crea el constructor con los cuatro atributos.

  3. Agrega getters para todos los atributos:

    • getMarca(), getModelo(), getAnio(), getVelocidadMax()
  4. Agrega setters solo para anio y velocidadMax, con validación:

    • setAnio(int anio) — solo acepta años entre 1885 y 2100
    • setVelocidadMax(double vel) — solo acepta valores mayores a 0
    • Si el valor no es válido, imprime un mensaje de error y no modifica el atributo
  5. Agrega el método describir() que imprima en consola la información del vehículo.

  6. Sobreescribe toString().

💡 Pista para el setter con validación:

public void setAnio(int anio) {
    if (anio >= 1885 && anio <= 2100) {
        this.anio = anio;
    } else {
        System.out.println("Error: año no válido.");
    }
}

Parte 2 — Clase Automovil (se construye en clase con el profesor)

Crea Automovil.java que extienda de Vehiculo:

  1. Atributos propios:

    • numPuertas → private
    • esElectrico → private
  2. Constructor usando super().

  3. Getters: getNumPuertas(), isElectrico()

  4. Setter con validación:

    • setNumPuertas(int n) — solo acepta valores entre 2 y 6
  5. Sobreescribe toString() incluyendo los atributos propios.


Parte 3 — Clase Avion (trabajo independiente)

Crea Avion.java que extienda de Vehiculo:

  1. Define al menos 2 atributos propios con modificador private (ejemplos: numMotores, altitudMaxima, aerolinea, numPasajeros)

  2. Constructor usando super().

  3. Getters y setters para todos tus atributos. Al menos un setter debe tener validación.

  4. Sobreescribe toString().

💡 Ejemplo de validación útil: altitudMaxima no debería aceptar valores negativos.


Parte 4 — Clase Barco (trabajo independiente)

Crea Barco.java que extienda de Vehiculo:

  1. Define al menos 2 atributos propios con modificador private (ejemplos: tipoCasco, tonelajeMaximo, numTripulantes, eslora)

  2. Constructor usando super().

  3. Getters y setters para todos tus atributos. Al menos un setter debe tener validación.

  4. Sobreescribe toString().


Parte 5 — Clase principal Main

  1. Crea un objeto de cada tipo: Automovil, Avion y Barco.
  2. Imprime la información de cada uno con toString().
  3. Prueba las validaciones de los setters con valores incorrectos a propósito:
auto.setAnio(1800);        // debe mostrar mensaje de error
auto.setNumPuertas(10);    // debe mostrar mensaje de error
  1. Luego corrige los valores con datos válidos y vuelve a imprimir.

Ejemplo de salida esperada:

=== Sistema de Transporte Multimodal ===

-- Automovil --
Marca: Toyota | Modelo: Corolla | Año: 2022 | Vel. Máx: 180.0 km/h
Puertas: 4 | Eléctrico: No

Error: año no válido.
Error: número de puertas no válido.

-- Avion --
Marca: Boeing | Modelo: 737 | Año: 2019 | Vel. Máx: 850.0 km/h
[tus atributos aquí]

-- Barco --
Marca: Ferretti | Modelo: 550 | Año: 2020 | Vel. Máx: 45.0 km/h
[tus atributos aquí]

¿Por qué es importante el encapsulamiento?

Observa la diferencia:

// ❌ Sin encapsulamiento — cualquiera puede poner cualquier valor
auto.anio = -500;   // ¡nadie lo detiene!

// ✅ Con encapsulamiento — el setter protege el dato
auto.setAnio(-500); // imprime error y no modifica el valor

El encapsulamiento protege la integridad de los datos del objeto.


Criterios de evaluación

Criterio Puntos
Clase Vehiculo con modificadores correctos (private/protected) 15
Getters para todos los atributos de Vehiculo 10
Setters de Vehiculo con validación funcionando 15
Clase Automovil con getter, setter validado y toString() 15
Clase Avion con atributos private, getters, setters y validación 20
Clase Barco con atributos private, getters, setters y validación 20
Main prueba valores inválidos y muestra mensajes de error 5
Total 100

Preguntas de reflexión

Responde en un archivo word junto con los temas como herencia, encapsulamiento etc:

  1. ¿Cuál es la diferencia entre private y protected? ¿En qué situación usarías cada uno?
  2. ¿Por qué marca y modelo no tienen setter? ¿Qué implica eso en el diseño?
  3. ¿Qué pasaría si un setter no tuviera validación y alguien pusiera un año negativo?

Entregable

Sube al repositorio en la carpeta lab03_encapsulamiento:

lab03_encapsulamiento/
├── Vehiculo.java
├── Automovil.java
├── Avion.java
├── Barco.java
└── Main.java

Laboratorio preparado para el curso de Programación Orientada a Objetos — Ago-Dic 2025