Domina los 4 pilares de la POO, interfaces gráficas con Swing, manejo de archivos y proyectos completos con diagramas UML y su implementación en Java.
Relación "es un" entre clases. extends, super(), @Override. Polimorfismo dinámico, casting. Clases abstractas como base jerárquica.
abstract class vs interface. Contratos de comportamiento con implements. Diferencias clave, múltiple implementación, uso real en Java.
JFrame, JPanel, componentes (JLabel, JButton, JTextField, JComboBox, JTextArea). Layouts (BorderLayout, FlowLayout, BoxLayout). ActionListener y eventos.
File, FileReader/Writer, BufferedReader/Writer, FileInputStream/OutputStream. Try-with-resources, IOException. Lectura y escritura de archivos de texto y binarios.
5 proyectos completos con contexto, diagrama UML (todas las relaciones) y código Java completo. Del análisis al código.
Material de repaso basado en las diapositivas de clase. Ref: Joyanes, L. & Zahonero, I. (2011). Programación en Java 6: Algoritmos y programación orientada a objetos. Mc Graw Hill.
La herencia permite crear jerarquías de clases reutilizando código. El polimorfismo permite que un objeto se comporte de formas distintas según su tipo real.
La herencia es el mecanismo por el cual una clase (subclase/hija) adquiere automáticamente los atributos y métodos de otra clase (superclase/padre). Modela la relación "ES UN".
Reutilización de código · Organización jerárquica · Extensibilidad · Base para el polimorfismo
La herencia biológica: un Perro es un Animal. Hereda características de Animal (respirar, moverse) pero añade las suyas propias (ladrar, raza).
Pilares relacionados:
| Concepto | ¿Qué hace? |
|---|---|
extends | Hereda de una sola clase padre |
super() | Llama al constructor del padre |
super.met() | Llama a un método del padre |
@Override | Sobreescribe un método heredado |
final | Impide que se sobreescriba/herede |
Una subclase redefine un método de la superclase. En tiempo de ejecución se llama al método de la clase real del objeto, no el de la referencia (binding dinámico).
Varios métodos con el mismo nombre pero distintos parámetros (tipo/cantidad) en la misma clase. Se resuelve en compilación.
Una clase Java solo puede extender una clase. Para comportamientos múltiples se usan interfaces (implements). Esto evita el "problema del diamante".
Contexto: Un banco maneja diferentes tipos de cuentas. Todas comparten atributos comunes pero calculan el interés de forma distinta. Usar herencia para modelar la jerarquía y polimorfismo para calcular intereses.
Una empresa tiene empleados de planta y contratistas. Todos tienen nombre y horas trabajadas, pero calculan su pago de forma diferente: empleados × tarifa fija + bono, contratistas × tarifa por hora sin bono.
private para encapsulamiento total (solo la propia clase accede). Usa protected cuando las subclases necesitan acceder directamente al atributo o método. Es más común ver private con getters/setters, o protected para atributos que las hijas usan en sus cálculos.Animal a = new Perro() — la referencia Animal apunta a un Perro. Downcasting (manual): Perro p = (Perro) a — recuperas la referencia específica. Usar instanceof antes para evitar ClassCastException: if (a instanceof Perro) { ... }super(args) en la primera línea de su constructor. Si el padre tiene un constructor sin parámetros (default), Java lo llama automáticamente. Omitir super() cuando es requerido genera error de compilación.Las clases abstractas definen una base incompleta que las subclases deben completar. Las interfaces definen contratos de comportamiento que cualquier clase puede cumplir.
Una clase abstracta (abstract class) es una clase que no puede instanciarse directamente. Sirve como plantilla base. Puede tener métodos concretos (con cuerpo) y abstractos (sin cuerpo).
Una interface define un contrato: qué métodos debe implementar quien la use. Los métodos son implícitamente public abstract. Las variables son public static final.
| Aspecto | Clase Abstracta | Interfaz |
|---|---|---|
| Instanciación | No puede instanciarse | No puede instanciarse |
| Métodos concretos | ✅ Sí | ✅ Solo con default/static (Java 8+) |
| Atributos de instancia | ✅ Sí | ❌ Solo constantes (public static final) |
| Constructor | ✅ Sí | ❌ No |
| Herencia múltiple | ❌ Solo una clase padre | ✅ Una clase puede implements múltiples |
| Palabra clave | extends | implements |
| Uso típico | "ES UN tipo de" | "PUEDE HACER" (contrato) |
Modelar una jerarquía de vehículos (Auto, Moto, Camión). Todos son vehículos (clase abstracta), pero algunos pueden implementar la interfaz Mantenible con métodos de revisión técnica.
default (con implementación) y static. El default provee una implementación por defecto que las clases pueden sobreescribir o no. Esto permite añadir métodos a interfaces sin romper las implementaciones existentes.public interface C extends A, B. Esto es distinto a las clases. Las interfaces forman su propia jerarquía de herencia múltiple.Swing es la biblioteca Java para crear interfaces gráficas. Proporciona JFrame, JPanel, botones, campos de texto, listas y más. Independiente de plataforma.
Swing es una biblioteca de clases Java para crear interfaces gráficas de usuario (GUI). Surge como mejora de AWT (Abstract Window Toolkit). Es independiente de la plataforma: el mismo código produce la misma apariencia en Windows, Linux y macOS.
import javax.swing.*; y import java.awt.*;
| Componente | Clase Java | Descripción |
|---|---|---|
| Ventana principal | JFrame | Contenedor top-level con barra de título, minimizar/maximizar/cerrar |
| Panel / Contenedor | JPanel | Agrupa componentes. Permite subdividir la ventana en zonas |
| Etiqueta | JLabel | Texto estático, no recibe eventos |
| Botón | JButton | Botón clickeable. Genera ActionEvent |
| Campo de texto (1 línea) | JTextField | El usuario escribe una línea de texto |
| Contraseña | JPasswordField | Campo de texto que oculta los caracteres |
| Área de texto (multi-línea) | JTextArea | Múltiples líneas de texto editable |
| Lista desplegable | JComboBox | Selección de una opción de una lista desplegable |
| Casilla de verificación | JCheckBox | Marcar/desmarcar opciones |
| Radio button | JRadioButton | Selección exclusiva de opciones (con ButtonGroup) |
Divide en 5 zonas: NORTH, SOUTH, EAST, WEST, CENTER. Layout por defecto de JFrame.
Coloca componentes en fila de izquierda a derecha. Layout por defecto de JPanel.
Cuadrícula de filas × columnas. Todos los componentes del mismo tamaño.
Apila horizontal (X_AXIS) o vertical (Y_AXIS). Flexible para formularios.
El más flexible. Control exacto de posición y tamaño con restricciones.
Posicionamiento absoluto con setBounds(x,y,w,h). Usar con cautela.
Un evento es una acción del usuario (clic, tecla, movimiento del ratón) que genera un objeto que notifica a un escuchador (Listener). El escuchador implementa una interfaz y ejecuta el código de respuesta.
| Evento | Interfaz Listener | Método | Cuándo se genera |
|---|---|---|---|
| ActionEvent | ActionListener | actionPerformed() | Clic en botón, Enter en campo |
| KeyEvent | KeyListener | keyPressed(), keyReleased() | Actividad del teclado |
| MouseEvent | MouseListener | mouseClicked(), mouseEntered() | Actividad del ratón |
| WindowEvent | WindowListener | windowClosing() | Cerrar/minimizar ventana |
| ItemEvent | ItemListener | itemStateChanged() | Selección en JComboBox/JCheckBox |
Crear una ventana con dos campos numéricos, un JComboBox para seleccionar la operación (+, -, *, /) y un botón "Calcular" que muestra el resultado en un JLabel.
Ventana de login con JTextField (usuario), JPasswordField (contraseña) y botón "Ingresar". Si las credenciales son correctas, mostrar mensaje de bienvenida; si no, mostrar error.
EXIT_ON_CLOSE: termina la aplicación (más común), HIDE_ON_CLOSE: oculta la ventana pero la app sigue corriendo, DISPOSE_ON_CLOSE: libera recursos de la ventana, DO_NOTHING_ON_CLOSE: no hace nada (debes manejar el evento manualmente).boton.addActionListener(e -> { /* tu código */ }); Es más corto y legible que la clase anónima con @Override.JOptionPane.showMessageDialog(null, "Mensaje") muestra info, JOptionPane.showInputDialog("Ingresa:") pide datos, JOptionPane.showConfirmDialog(null,"¿Seguro?") pide Sí/No.Java permite leer y escribir archivos de texto y binarios. La clase File gestiona rutas. FileReader/Writer y BufferedReader/Writer trabajan con texto. Streams con binarios.
La clase File NO lee ni escribe datos. Es una representación abstracta de una ruta (path) de archivo o directorio. Se usa para gestionar la existencia, crear, borrar y listar.
| Clase | Tipo de dato | Característica principal | Uso típico |
|---|---|---|---|
FileWriter | Texto (char) | Escribe carácter por carácter. Sin buffer. | Archivos de texto pequeños |
FileReader | Texto (char) | Lee carácter por carácter. Sin buffer. | Leer texto simple |
BufferedWriter | Texto (char) | Envuelve FileWriter. Buffer mejora rendimiento. Método newLine(). | Archivos de texto grandes |
BufferedReader | Texto (char) | Envuelve FileReader. Método readLine() lee línea completa. | Lectura línea por línea |
FileOutputStream | Binario (byte) | Escribe bytes crudos. | Imágenes, ejecutables |
FileInputStream | Binario (byte) | Lee bytes crudos. | Copiar archivos binarios |
Toda operación con archivos puede lanzar IOException. En Java moderno usa try-with-resources para garantizar que el archivo se cierre automáticamente, incluso si hay error.
Un sistema académico permite ingresar el nombre del alumno y su nota, y los guarda en un archivo "notas.txt". Al presionar "Ver notas" lee el archivo y muestra el contenido en un JTextArea.
try-with-resources que llama automáticamente a close() al salir del bloque.true como segundo parámetro (modo append): new FileWriter("archivo.txt", true). Sin este parámetro, el FileWriter sobreescribe el archivo desde el principio (borra todo el contenido previo).Serializable. Se usa ObjectOutputStream para escribir y ObjectInputStream para leer. Útil para persistir el estado de objetos entre ejecuciones del programa.5 proyectos con contexto real, diagrama UML completo (todas las relaciones) y su implementación en Java. Del análisis al código.
Una universidad tiene Facultades que contienen Cursos (composición, un curso no existe sin su facultad). Los cursos tienen Alumnos inscritos (agregación, el alumno existe sin el curso). Los Profesores dictan cursos (asociación). Existe una jerarquía: Persona es la clase base de Alumno y Profesor. La interfaz Evaluable define el contrato de calificación.
Una tienda vende Productos de distintos tipos: Físicos (tienen peso y stock) y Digitales (tienen URL de descarga). El Inventario tiene una colección de productos (agregación). La interfaz Vendible define el precio final. El empleado usa una GUI Swing para registrar ventas.
Un banco gestiona cuentas. Cuenta es la clase abstracta base. CuentaAhorros y CuentaCorriente la heredan. La interfaz Transaccionable define depositar/retirar y la interfaz Auditable define el registro de movimientos. Todas las cuentas de un Cliente están en composición (las cuentas son del banco, no del cliente — si el cliente se va, el banco sigue teniendo el registro). Empleado tiene asociación reflexiva (un empleado puede tener un supervisor Empleado).
Un hospital tiene Médicos y Pacientes, ambos son Personas (herencia). Se generan CitasMédicas que asocian a un médico con un paciente (asociación). El hospital tiene Departamentos (composición). La interfaz Notificable permite enviar avisos de citas.
Una empresa quiere gestionar sus productos y pedidos. Combina todos los temas: jerarquía de productos (herencia + abstracción), catálogo de productos (agregación), pedidos (composición con los ítems del pedido), interfaz gráfica Swing para registrar pedidos y persistencia en archivo de texto.
10 preguntas sobre Herencia, Polimorfismo, Abstracción e Interfaces. Mezcla de opción múltiple y Verdadero/Falso.
12 preguntas sobre GUI con Swing y Manejo de Archivos en Java. ¡Demuestra lo aprendido!
Repasaste herencia, polimorfismo, abstracción, interfaces, GUI con Swing, manejo de archivos y 5 proyectos completos UML → Java. ¡Sigue practicando con código!
Ref: Joyanes, L. & Zahonero, I. (2011). Programación en Java 6. Mc Graw Hill.