Making a Promise
When you're writing an abstract class you will encounter methods that you know most subclasses will need to perform. For our animal example, this might be walk() or eat().
You will frequently be met with a choice: do I write a method to provide some sort of default behavior, or make an abstract method and ask the subclass to always define it.
Option #1 - Default Method
I could write some code that simply does nothing. If an animal doesn't explain how it eats, it simply calls my useless code.
public void eat()
This seems silly. When we really have no behavior to define, we instead can write an abstract method.
Option #2 - Abstract Method
We won't define what eating does here, but we promise our subclasses will write an eat() method.
abstract public void eat();
This is really powerful. It means that code that calls the abstract class can use the eat() method freely!
We just have to make sure to write it in the subclasses. Fortunately, writing this code allows the compiler to force you to write it. You won't even be able to run a subclass until you write an eat() method.