FreeCodeCamp https://www.youtube.com/watch?v=WnMQ8HlmeXc&t=403s
Concepto: Representa una relación entre dos clases. Una clase conoce a otra.
- Ejemplo en Java:
class Profesor { private List<Alumno> alumnos; public Profesor() { this.alumnos = new ArrayList<>(); } public void addAlumno(Alumno alumno) { alumnos.add(alumno); } public List<Alumno> getAlumnos() { return alumnos; } } class Alumno { private Profesor profesor; public Alumno(Profesor profesor) { this.profesor = profesor; } public Profesor getProfesor() { return profesor; } } public class Main { public static void main(String[] args) { Profesor profesor = new Profesor(); Alumno alumno1 = new Alumno(profesor); Alumno alumno2 = new Alumno(profesor); profesor.addAlumno(alumno1); profesor.addAlumno(alumno2); System.out.println("El profesor tiene " + profesor.getAlumnos().size() + " alumnos."); } }
Concepto: Una clase (subclase) hereda de otra clase (superclase).
- Ejemplo en Java:
class Animal { void hacerSonido() { System.out.println("El animal hace un sonido."); } } class Perro extends Animal { @Override void hacerSonido() { System.out.println("El perro ladra."); } } public class Main { public static void main(String[] args) { Animal miPerro = new Perro(); miPerro.hacerSonido(); // Salida: El perro ladra. } }
Concepto: Una clase implementa una interfaz.
- Ejemplo en Java:
interface Vehiculo { void conducir(); } class Coche implements Vehiculo { public void conducir() { System.out.println("El coche está en movimiento."); } } public class Main { public static void main(String[] args) { Vehiculo miCoche = new Coche(); miCoche.conducir(); // Salida: El coche está en movimiento. } }
Concepto: Una clase usa a otra clase como parte de su funcionamiento.
- Ejemplo en Java:
class Producto { private String nombre; public Producto(String nombre) { this.nombre = nombre; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } } class Pedido { public void procesar(Producto producto) { System.out.println("Procesando el producto: " + producto.getNombre()); } } public class Main { public static void main(String[] args) { Producto producto = new Producto("Laptop"); Pedido pedido = new Pedido(); pedido.procesar(producto); // Salida: Procesando el producto: Laptop } }
Concepto: Representa una relación de "todo/parte" donde la parte puede existir independientemente del todo.
- Ejemplo en Java:
class Empleado { private String nombre; public Empleado(String nombre) { this.nombre = nombre; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } } class Departamento { private List<Empleado> empleados; public Departamento() { this.empleados = new ArrayList<>(); } public void addEmpleado(Empleado empleado) { empleados.add(empleado); } public List<Empleado> getEmpleados() { return empleados; } } public class Main { public static void main(String[] args) { Empleado emp1 = new Empleado("Juan"); Empleado emp2 = new Empleado("Maria"); Departamento depto = new Departamento(); depto.addEmpleado(emp1); depto.addEmpleado(emp2); for (Empleado e : depto.getEmpleados()) { System.out.println("Empleado: " + e.getNombre()); } // Los empleados pueden existir independientemente del departamento } }
Concepto: Una forma fuerte de agregación donde la parte no puede existir sin el todo.
- Ejemplo en Java:
class Habitacion { private String nombre; public Habitacion(String nombre) { this.nombre = nombre; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } } class Casa { private List<Habitacion> habitaciones; public Casa() { this.habitaciones = new ArrayList<>(); } public void addHabitacion(String nombre) { Habitacion habitacion = new Habitacion(nombre); habitaciones.add(habitacion); } public List<Habitacion> getHabitaciones() { return habitaciones; } } public class Main { public static void main(String[] args) { Casa casa = new Casa(); casa.addHabitacion("Sala"); casa.addHabitacion("Cocina"); for (Habitacion h : casa.getHabitaciones()) { System.out.println("Habitación: " + h.getNombre()); } // Las habitaciones no pueden existir independientemente de la casa } }
Relación | Descripción | Ejemplo en Java |
---|---|---|
Asociación | Relación entre dos clases. Una clase conoce a otra. | Profesor y Alumno |
Herencia | Una clase (subclase) hereda de otra clase (superclase). | Animal y Perro |
Realization/Implementation | Una clase implementa una interfaz. | Vehiculo y Coche |
Dependencia | Una clase usa a otra clase como parte de su funcionamiento. | Pedido y Producto |
Agregación | Relación de "todo/parte" donde la parte puede existir independientemente. | Departamento y Empleado |
Composición | Relación "todo/parte" fuerte donde la parte no puede existir sin el todo. | Casa y Habitacion |
La asociación representa una relación en la que una clase conoce a otra clase. Es una relación flexible y común en la mayoría de los modelos de datos.
La herencia permite que una clase (subclase) herede propiedades y comportamientos de otra clase (superclase). Facilita la reutilización de código y la creación de jerarquías de clases.
En UML, la realización muestra que una clase implementa una interfaz. La interfaz define un contrato que la clase debe cumplir.
La dependencia indica que una clase utiliza otra clase como parte de su método o funcionalidad. Es una relación temporal y débil.
La agregación es una forma de asociación que indica una relación "todo/parte" en la que las partes pueden existir independientemente del todo.
La composición es una forma fuerte de agregación donde las partes no pueden existir sin el todo. Cuando el todo se destruye, también lo hacen las partes.
Estos conceptos son fundamentales para entender las relaciones entre clases en la programación orientada a objetos y son esenciales para diseñar sistemas robustos y mantenibles.