At first, understanding abstract classes and their purpose can be a bit tricky. It's really not all that complex, though. Abstract classes basically enforces rules on child classes, and increases code reusability. Here are some rules that abstract classes (and their child classes) follow:

  • An abstract class cannot be directly instantiated, - a child class extend the abstract class and the child class can be instantiated.
  • An abstract class with only abstract method signatures should be an interface - not an abstract class. When using an abstract class - fully implement a common method which all child classes share into the abstract class.
  • Classes which extend an abstract class must implement the abstract methods of the parent abstract class.
  • Child classes of an abstract class can include more methods that aren't declared in the abstract class.
  • The abstract methods declared in an abstract class, should differ in implementation in all the child classes. Otherwise they could have been fully implemented in the abstract class.

Below is a very simple example of using abstract classes in Java

Enemy Class

public abstract class Enemy
{
    protected String name;
    
    abstract void slam(Enemy e);
    abstract void punch(Enemy e);
    
    public String toString() {
        return "My name is " + name + " and I am an enemy";   
    }
    
    public void eat() {
        System.out.println("I am eating... Ohm nom nom nom...");   
    }
}

Walrus Class

public class Walrus extends Enemy
{
    public Walrus() {
        this.name = "Walrus";   
    }
    
    public void slam(Enemy e) {
        System.out.println("I am slamming " + e.name);   
    }
    
    public void punch(Enemy e) {
        System.out.println("I am punching " + e.name);   
    }
    
}

Platypus Class

public class Platypus extends Enemy
{
    public Platypus() {
        this.name = "Platypus";   
    }
    
    public void slam(Enemy e) {
        System.out.println("I am a platypus, and I am slamming " + e.name);   
    }
    
    public void punch(Enemy e) {
        System.out.println("I am a platypus I am punching " + e.name);   
    }
    
    public void swim() {
        System.out.println("I am swimming...");   
    }
}

Driver

public class driver
{
    public static void main(String[] args) {
           Walrus walrus = new Walrus();
           Platypus plat = new Platypus();
           
           walrus.slam(plat);
           plat.punch(walrus);
           
           System.out.println(plat);
           System.out.println(walrus);
    }
}