Abstract class — partial implementation, single inheritance. Interface — pure contract, multiple inheritance.
Analogy: Abstract class = partially-built house (some rooms done, some blueprints). Interface = building code (lists requirements, builds nothing).
Abstract class:
abstract keyword.1abstract class Shape {2 protected String color;34 public Shape(String color) {5 this.color = color;6 }78 public void display() {9 System.out.println("Color: " + color);10 }1112 public abstract double area();13}1415class Circle extends Shape {16 private double radius;1718 public Circle(String color, double radius) {19 super(color);20 this.radius = radius;21 }2223 @Override24 public double area() {25 return Math.PI * radius * radius;26 }27}
Interface:
interface keyword.public abstract by default.default and static methods.1interface Drawable {2 void draw();34 default void fill() {5 System.out.println("Default fill");6 }7}89interface Resizable {10 void resize(double factor);11}1213class Rectangle implements Drawable, Resizable {14 @Override15 public void draw() { System.out.println("Drawing rectangle"); }1617 @Override18 public void resize(double factor) { System.out.println("Resizing by " + factor); }19}
Key differences:
When to use: