Inside an abstract class, you'll write kinds of methods. An abstract method has no body. It declares a return type, a name, and parameters, then ends with a semicolon. A concrete method has a full body that subclasses inherit as-is.
abstract class Animal {
abstract void speak(); // abstract: no body
void breathe() { // concrete: has a body
System.out.println("Breathing");
}
}
Subclasses must override every abstract method but can use concrete methods without changes. If you want a subclass to optionally change a concrete method, mark it in your documentation. The compiler won't force an override on concrete methods.