# data[].attributes.body
La herencia es un mecanismo de la programación orientada a objetos (OOP) que permite que una clase (subclase o clase hija) herede atributos y métodos de otra clase (superclase o clase padre). Esto promueve la reutilización de código y la organización jerárquica.

# data[].attributes.body
Una superclase define comportamientos generales.

# data[].attributes.body
Una subclase extiende esa funcionalidad y puede agregar o modificar comportamientos

# data[].attributes.body
Se utiliza la palabra clave extends en Java para declarar herencia.

# data[].attributes.body
Las subclases pueden sobrescribir métodos de la superclase para proporcionar una implementación específica.

# data[].attributes.body
Se utiliza la anotación @Override para mayor claridad.

# data[].attributes.body
super se usa para llamar al constructor o métodos de la superclase desde una subclase.

# data[].attributes.body
Esto es útil para inicializar correctamente objetos heredados.

# data[].attributes.body
Son clases que no pueden ser instanciadas directamente.

# data[].attributes.body
Se usan como base para otras clases y pueden contener métodos abstractos (sin implementación).

# data[].attributes.body
Se declara con abstract.

# data[].attributes.body
Herencia: se usa cuando hay una relación “es-un” (ej. Un perro es un animal).

# data[].attributes.body
Composición: se usa cuando hay una relación “tiene-un” (ej. Un coche tiene un motor).

# data[].attributes.body
Herencia mal utilizada puede producir diseños frágiles o acoplados.

# data[].attributes.body
Se deben evitar jerarquías profundas o confusas.

# data[].attributes.body
A veces, la composición es preferible a la herencia.

# data[].attributes.body
Gracias a la herencia, los objetos pueden ser tratados como instancias de su superclase, lo que permite el polimorfismo.

# data[].attributes.body
Esto es clave para diseñar sistemas más flexibles y extensibles.