Lesson 16 of 25

Abstraction & Interfaces

Abstract Classes

Abstract classes define a template with some implemented methods and some abstract methods that subclasses must implement.

Example
public abstract class Vehicle {
    protected String brand;

    public Vehicle(String brand) {
        this.brand = brand;
    }

    // Abstract method — must be implemented by subclasses
    public abstract void start();
    public abstract double fuelEfficiency();

    // Concrete method — inherited as-is
    public String getBrand() {
        return brand;
    }
}

public class ElectricCar extends Vehicle {
    public ElectricCar(String brand) {
        super(brand);
    }

    @Override
    public void start() {
        System.out.println(brand + " starts silently.");
    }

    @Override
    public double fuelEfficiency() {
        return 120.0; // miles per kWh equivalent
    }
}

Interfaces

Interfaces define a contract — a set of methods a class must implement. A class can implement multiple interfaces.

Example
// Define interfaces
public interface Printable {
    void print();
}

public interface Exportable {
    String export(String format);

    // Default method (Java 8+)
    default String exportAsJson() {
        return export("json");
    }
}

// Implement multiple interfaces
public class Report implements Printable, Exportable {
    private String title;
    private String content;

    public Report(String title, String content) {
        this.title = title;
        this.content = content;
    }

    @Override
    public void print() {
        System.out.println(title + ": " + content);
    }

    @Override
    public String export(String format) {
        return String.format("[%s] %s: %s", format, title, content);
    }
}