An interface and an abstract class can both ship working code today. The real dividing lines are state, constructors and the single-inheritance slot.
Java 8 added default and static methods to interfaces. C# 8 added default interface implementations.
interface Greeter {
String name();
default String greet() { return "Hi, " + name(); }
}
Interfaces cannot hold instance fields (per-object data) or define constructors. An abstract class holds both, plus protected helpers subclasses share.
| Feature | Interface | Abstract class |
|---|---|---|
| Method bodies | Yes, default and static | Yes |
| Instance fields | No | Yes |
| Constructors | No | Yes |
| Allowed per class | Many | One |
A class can implement many interfaces but extend only one abstract class. That makes an interface cheap to add to a type that already has a parent. An abstract class can carry state and enforce an order of steps.
The choice comes down to whether subclasses genuinely share code, or only share a capability that callers depend on.
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.
Why there's no diagram: “”
The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓
The diagram below the answer is the concept . Jump to it ↓