What is the difference between an abstract class and an interface in Java?

8 minintermediateabstract-classinterfaceoop

Quick Answer

An abstract class can hold state, constructors, and a mix of abstract and concrete methods, but supports only single inheritance. An interface defines a contract (plus, since Java 8, default/static methods), holds only constants, has no constructors, and a class can implement any number of interfaces.

Detailed Answer

Abstract classInterface
Fieldsany (instance state)only public static final constants
Constructorsyesno
Method bodiesabstract + concrete methodsabstract, default, static, private methods
Inheritancesingle (extends)multiple (implements several)
Access modifiers on methodsanyimplicitly public (unless private)
When to useshared state + partial implementation, "is-a" hierarchya capability/contract multiple unrelated classes can fulfill
abstract class Vehicle {
    protected int speed;
    abstract void accelerate();
    void brake() { speed = 0; } // shared implementation
}

interface Drivable {
    void steer(double angle);
    default void honk() { System.out.println("Beep!"); } // Java 8+
}

class Car extends Vehicle implements Drivable {
    void accelerate() { speed += 10; }
    public void steer(double angle) { /* ... */ }
}

Rule of thumb: use an abstract class when subclasses share meaningful state/implementation; use an interface to describe a capability that unrelated classes can opt into (and to get multiple "inheritance" of behavior via default methods).