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:
velocidadMaxusa modificadorprotected— ¿por qué crees que es diferente aprivate? Discútelo con tu equipo.
Instrucciones
Parte 1 — Clase Vehiculo (se construye en clase con el profesor)
Crea Vehiculo.java con lo siguiente:
-
Declara los atributos:
marcaymodelo→privateanio→privatevelocidadMax→protected(las subclases podrán accederlo directamente)
-
Crea el constructor con los cuatro atributos.
-
Agrega getters para todos los atributos:
getMarca(),getModelo(),getAnio(),getVelocidadMax()
-
Agrega setters solo para
anioyvelocidadMax, con validación:setAnio(int anio)— solo acepta años entre1885y2100setVelocidadMax(double vel)— solo acepta valores mayores a0- Si el valor no es válido, imprime un mensaje de error y no modifica el atributo
-
Agrega el método
describir()que imprima en consola la información del vehículo. -
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:
-
Atributos propios:
numPuertas→privateesElectrico→private
-
Constructor usando
super(). -
Getters:
getNumPuertas(),isElectrico() -
Setter con validación:
setNumPuertas(int n)— solo acepta valores entre2y6
-
Sobreescribe
toString()incluyendo los atributos propios.
Parte 3 — Clase Avion (trabajo independiente)
Crea Avion.java que extienda de Vehiculo:
-
Define al menos 2 atributos propios con modificador
private(ejemplos:numMotores,altitudMaxima,aerolinea,numPasajeros) -
Constructor usando
super(). -
Getters y setters para todos tus atributos. Al menos un setter debe tener validación.
-
Sobreescribe
toString().
💡 Ejemplo de validación útil:
altitudMaximano debería aceptar valores negativos.
Parte 4 — Clase Barco (trabajo independiente)
Crea Barco.java que extienda de Vehiculo:
-
Define al menos 2 atributos propios con modificador
private(ejemplos:tipoCasco,tonelajeMaximo,numTripulantes,eslora) -
Constructor usando
super(). -
Getters y setters para todos tus atributos. Al menos un setter debe tener validación.
-
Sobreescribe
toString().
Parte 5 — Clase principal Main
- Crea un objeto de cada tipo:
Automovil,AvionyBarco. - Imprime la información de cada uno con
toString(). - 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
- 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:
- ¿Cuál es la diferencia entre
privateyprotected? ¿En qué situación usarías cada uno? - ¿Por qué
marcaymodelono tienen setter? ¿Qué implica eso en el diseño? - ¿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