I recommend watching my Introduction to the Abstract Modifier before continuing with this tutorial. In that tutorial I described how an Airplane, Helicopter, and a Glider all have an IS-A relationship with a Flying Machine. I also stated that a Boeing 787, FA18 Fighter, and the Cessna Amphibian all have an IS-A relationship with an Airplane. In the abstract Airplane class I created two abstract methods, takeOff and land. I also stated that the Flying Machine would be a perfect candidate to be a superclass. It makes sense that the abstract Airplane class can be derived from an abstract FlyingMachine class. The FlyingMachine class would become even more abstract than the abstract Airplane class. One thing that I can think of that all flying machines have in common is that they must take off; landing may not apply to all flying machines, take a satellite for example. It flies around the earth at a really high altitude, but it will never land. The engineers who make satellites do not design them to have landing capabilities. So it would not make sense to force all subclasses of Flying Machine to have a land method, whereas all Airplane subclasses should require a land method.
Here are some of the rules that apply to using the abstract modifier:
An abstract method cannot have a method body and it must have a semicolon directly after the signature.
If at least one method inside of a class is marked abstract, then the class must be marked abstract also.
Applying the abstract modifier to a class prevents the class from being instantiated. An abstract class can only be inherited.
Abstract methods must be overridden in a concrete subclass. A concrete subclass is simply a class without the abstract modifier that extends an abstract class. If a concrete subclass does not override an inherited abstract method then a compiler error will occur.
An abstract class may contain static variables (class variables) and static methods.