You (may) need abstract classes when you create an inheritance tree, with a single ancestor that cannot be instantiated, simply because it is unknown how some methods could be implemented.
Marking a class as abstract will tell the compiler about this situation.
Example 1
If you need a single ancestor for a Car and a Bicycle, you would probably create a Vehicle class. You cannot create this Vehicle class, because it is not finished. A Vehicle itself will not work. That's why Vehicle will be abstract.
Example 2
Another example from the .Net framework. The Stream class is an abstract class that provides basic I/O functionality. It provides a Read and Write method to handle bytes to the underlaying stream.
This string can be a FileStream, NetworkStream, Memory... etc. The Stream itself does not know how to read or write from the concrete implementation of the stream. But some methods of Stream are implemented, because they are shared by all instances of the stream.
This is not possible with an interface. So you need to create a class. Since the Read/Write methods cannot beimplemented, Stream is marked as abstract. This will prevent the Stream class from being created as-is.