Semestre 02, 2026
En la programación orientada a objetos, las relaciones entre clases permiten definir cómo interactúan y se comunican los distintos componentes de un sistema.
Clase A usa Clase B temporalmente para realizar una operación o tarea específica.
Un Pedido depende de Pago para procesar un cobro. Sin embargo, el Pedido no guarda un atributo de tipo Pago: solo necesita usarlo en el momento de realizar la transacción.
classDiagram
Pedido ..> Pago : usa
public class Pago {
public void realizar() {
System.out.println("Pago realizado.");
}
}
Declara la clase Pago.
public class Pago {
public void realizar() {
System.out.println("Pago realizado.");
}
}
El método realizar() imprime "Pago realizado." en consola.
public class Pedido {
public void procesarPago(Pago pago) {
pago.realizar();
}
}
Declara la clase Pedido.
public class Pedido {
public void procesarPago(Pago pago) {
pago.realizar();
}
}
procesarPago() recibe un objeto Pago como parámetro: es un uso temporal.
public class Pedido {
public void procesarPago(Pago pago) {
pago.realizar();
}
}
Invoca realizar() sobre ese Pago. No lo guarda como atributo.
public class Main {
public static void main(String[] args) {
Pago pago = new Pago();
Pedido pedido = new Pedido();
pedido.procesarPago(pago);
}
}
Crea un objeto Pago.
public class Main {
public static void main(String[] args) {
Pago pago = new Pago();
Pedido pedido = new Pedido();
pedido.procesarPago(pago);
}
}
Crea un objeto Pedido.
public class Main {
public static void main(String[] args) {
Pago pago = new Pago();
Pedido pedido = new Pedido();
pedido.procesarPago(pago);
}
}
Pasa el Pago a procesarPago(): la dependencia ocurre solo aquí.
Aquí Pedido depende de Pago únicamente en el método procesarPago(). No existe una relación de atributo entre las clases.
Una clase tiene uno o más atributos que son instancias de otra clase. Es más permanente que la dependencia y representa un vínculo lógico entre las clases.
Un Carro tiene un Motor como atributo. La relación existe mientras el Carro exista, pero el Motor puede ser compartido o reemplazado.
classDiagram
Carro --> Motor : motor
public class Motor {
public void encender() {
System.out.println("Motor encendido.");
}
}
Declara la clase Motor.
public class Motor {
public void encender() {
System.out.println("Motor encendido.");
}
}
El método encender() imprime "Motor encendido.".
public class Carro {
private Motor motor;
public Carro(Motor motor) {
this.motor = motor;
}
public void arrancar() {
motor.encender();
}
}
Atributo motor de tipo Motor: un vínculo permanente (has-a).
public class Carro {
private Motor motor;
public Carro(Motor motor) {
this.motor = motor;
}
public void arrancar() {
motor.encender();
}
}
El constructor recibe un Motor y lo guarda como atributo.
public class Carro {
private Motor motor;
public Carro(Motor motor) {
this.motor = motor;
}
public void arrancar() {
motor.encender();
}
}
arrancar() usa el atributo motor para encenderlo.
public class Main {
public static void main(String[] args) {
Motor motor = new Motor();
Carro carro = new Carro(motor);
carro.arrancar();
}
}
Crea un objeto Motor.
public class Main {
public static void main(String[] args) {
Motor motor = new Motor();
Carro carro = new Carro(motor);
carro.arrancar();
}
}
Crea un Carro pasándole el Motor.
public class Main {
public static void main(String[] args) {
Motor motor = new Motor();
Carro carro = new Carro(motor);
carro.arrancar();
}
}
arrancar() enciende el motor guardado.
Aquí Carro tiene-a Motor como atributo. La relación es directa y más estable que la dependencia.
Una clase tiene objetos de otra clase como atributos, pero esas partes pueden existir independientemente del todo.
Una Moto está compuesta por Ruedas y un Motor. Si la Moto deja de existir, las Ruedas y el Motor aún pueden existir por separado.
classDiagram
Moto o-- Rueda : ruedas
Moto o-- Motor : motor
public class Rueda {
public void girar() {
System.out.println("La rueda está girando.");
}
}
public class Motor {
public void encender() {
System.out.println("Motor encendido.");
}
}
Cada parte es una clase independiente: una Rueda gira y un Motor enciende, sin necesitar a la Moto.
public class Moto {
private Rueda[] ruedas;
private Motor motor;
public Moto(Rueda[] ruedas, Motor motor) {
this.ruedas = ruedas;
this.motor = motor;
}
public void arrancar() {
motor.encender();
for (Rueda rueda : ruedas) {
rueda.girar();
}
}
}
Atributos: un arreglo de Ruedas y un Motor.
public class Moto {
private Rueda[] ruedas;
private Motor motor;
public Moto(Rueda[] ruedas, Motor motor) {
this.ruedas = ruedas;
this.motor = motor;
}
public void arrancar() {
motor.encender();
for (Rueda rueda : ruedas) {
rueda.girar();
}
}
}
El constructor recibe las partes ya creadas desde afuera; por eso pueden existir sin la Moto.
public class Moto {
private Rueda[] ruedas;
private Motor motor;
public Moto(Rueda[] ruedas, Motor motor) {
this.ruedas = ruedas;
this.motor = motor;
}
public void arrancar() {
motor.encender();
for (Rueda rueda : ruedas) {
rueda.girar();
}
}
}
arrancar() enciende el motor y hace girar cada rueda.
public class Main {
public static void main(String[] args) {
Rueda[] ruedas = { new Rueda(), new Rueda() };
Motor motor = new Motor();
Moto moto = new Moto(ruedas, motor);
moto.arrancar();
}
}
Crea las Ruedas por separado.
public class Main {
public static void main(String[] args) {
Rueda[] ruedas = { new Rueda(), new Rueda() };
Motor motor = new Motor();
Moto moto = new Moto(ruedas, motor);
moto.arrancar();
}
}
Crea el Motor por separado.
public class Main {
public static void main(String[] args) {
Rueda[] ruedas = { new Rueda(), new Rueda() };
Motor motor = new Motor();
Moto moto = new Moto(ruedas, motor);
moto.arrancar();
}
}
Crea la Moto recibiendo partes que ya existían.
public class Main {
public static void main(String[] args) {
Rueda[] ruedas = { new Rueda(), new Rueda() };
Motor motor = new Motor();
Moto moto = new Moto(ruedas, motor);
moto.arrancar();
}
}
Arranca la moto.
Aquí Moto agrega Ruedas y Motor. Aunque la Moto desaparezca, las Ruedas y el Motor pueden seguir existiendo.
Es una variante de la agregación donde las partes no pueden existir independientemente del todo. Si el objeto contenedor se destruye, también se destruyen sus partes.
Una Casa tiene Habitaciones. Las habitaciones no tienen sentido fuera de la casa.
classDiagram
Casa *-- Habitacion : habitaciones
public class Habitacion {
public void abrirPuerta() {
System.out.println("Puerta abierta.");
}
}
Declara la clase Habitacion.
public class Habitacion {
public void abrirPuerta() {
System.out.println("Puerta abierta.");
}
}
El método abrirPuerta() imprime "Puerta abierta.".
public class Casa {
private Habitacion[] habitaciones;
public Casa() {
habitaciones = new Habitacion[5];
for (int i = 0; i < 5; i++) {
habitaciones[i] = new Habitacion();
}
}
public void recorrerCasa() {
for (Habitacion h : habitaciones) {
h.abrirPuerta();
}
}
}
Atributo: un arreglo de Habitaciones.
public class Casa {
private Habitacion[] habitaciones;
public Casa() {
habitaciones = new Habitacion[5];
for (int i = 0; i < 5; i++) {
habitaciones[i] = new Habitacion();
}
}
public void recorrerCasa() {
for (Habitacion h : habitaciones) {
h.abrirPuerta();
}
}
}
El constructor: la Casa crea sus propias habitaciones.
public class Casa {
private Habitacion[] habitaciones;
public Casa() {
habitaciones = new Habitacion[5];
for (int i = 0; i < 5; i++) {
habitaciones[i] = new Habitacion();
}
}
public void recorrerCasa() {
for (Habitacion h : habitaciones) {
h.abrirPuerta();
}
}
}
Crea 5 Habitacion dentro de la Casa; nacen con ella.
public class Casa {
private Habitacion[] habitaciones;
public Casa() {
habitaciones = new Habitacion[5];
for (int i = 0; i < 5; i++) {
habitaciones[i] = new Habitacion();
}
}
public void recorrerCasa() {
for (Habitacion h : habitaciones) {
h.abrirPuerta();
}
}
}
recorrerCasa() abre la puerta de cada habitación.
public class Main {
public static void main(String[] args) {
Casa casa = new Casa();
casa.recorrerCasa();
}
}
Al crear la Casa se crean automáticamente sus Habitaciones.
public class Main {
public static void main(String[] args) {
Casa casa = new Casa();
casa.recorrerCasa();
}
}
Recorre la casa. Si la Casa se destruye, sus Habitaciones también.
Aquí Casa compone Habitaciones. Las habitaciones son creadas y destruidas junto con la Casa.
Relación Clase A es-una Clase B.
| Relación | Definición | Ejemplo |
|---|---|---|
| Dependencia | Uso temporal de otra clase | Pedido → Pago |
| Asociación | Atributo de una clase es otra clase | Carro → Motor |
| Agregación | Todo-parte (partes independientes) | Moto → Rueda |
| Composición | Todo-parte fuerte (partes dependientes) | Casa → Habitacion |