
En programación orientada a objetos, un concepto fundamental es la diferencia entre métodos abstractos y no abstractos. Un error común, especialmente para quienes están aprendiendo, surge cuando se intenta declarar un método no abstracto sin definir su comportamiento, lo que lleva al error: "Non abstract method must contain body".
¿Qué es un Método?
Un método es un bloque de código que realiza una tarea específica. Esencialmente, es una función dentro de una clase. Define una acción que un objeto de esa clase puede realizar. Piénsalo como una forma de interactuar con el objeto o de hacer que el objeto haga algo.
Métodos Abstractos vs. No Abstractos
Existen dos tipos principales de métodos: abstractos y no abstractos (también llamados concretos). La diferencia clave radica en si tienen o no una implementación, es decir, un cuerpo con código dentro de ellos.
Must Read
Un método abstracto se declara, pero no se define. Solo tiene la firma del método (nombre, tipo de retorno y parámetros), pero no tiene un cuerpo (las llaves `{}` que contienen el código). Los métodos abstractos se utilizan dentro de las clases abstractas para forzar a las clases hijas a proporcionar una implementación específica para ese método. Una clase abstracta no se puede instanciar directamente; debe ser extendida.
Un método no abstracto, por otro lado, debe tener un cuerpo. Este cuerpo contiene el código que se ejecutará cuando se llame al método. Define cómo se realiza la acción del método.

El Error: "Non Abstract Method Must Contain Body"
Este error ocurre cuando declaras un método que no está marcado como `abstract`, pero tampoco le das un cuerpo. El compilador asume que se trata de un método que debe tener una implementación definida, y al no encontrarla, lanza el error.
Imagina que tienes una clase llamada `Animal` y quieres definir un método llamado `hacerSonido`. Si declaras este método como no abstracto, necesitas decirle al programa qué sonido debe hacer el animal.
Por ejemplo (en pseudo-código, para simplificar):

class Animal {
void hacerSonido() { // Método no abstracto
System.out.println("Sonido genérico de animal"); // Cuerpo del método
}
}
En este caso, el método `hacerSonido` tiene un cuerpo, por lo que no hay error. Si omitiéramos el cuerpo, como en el siguiente ejemplo, obtendríamos el error:
class Animal {
void hacerSonido(); // Método no abstracto sin cuerpo
}

Cómo Solucionar el Error
La solución es sencilla: si el método no debe ser abstracto, entonces debes proporcionarle un cuerpo. El cuerpo del método define qué acciones realiza cuando se le llama.
Si el método debe ser abstracto (es decir, las clases hijas deben implementar su propia versión), entonces debes declararlo como `abstract` y asegurarte de que la clase que lo contiene también sea `abstract`.
Aquí tienes un ejemplo de cómo se vería un método abstracto:

abstract class Animal {
abstract void hacerSonido(); // Método abstracto (sin cuerpo)
}
En este caso, `Animal` es una clase abstracta porque contiene un método abstracto. Las clases que hereden de `Animal` deberán proporcionar una implementación para el método `hacerSonido`.
En Resumen
Recuerda: un método no abstracto siempre debe tener un cuerpo. Si un método no tiene cuerpo, debe ser declarado como `abstract` dentro de una clase `abstract`. Entender esta distinción es crucial para escribir código orientado a objetos limpio y correcto.