Abstract class — partial implementation, single inheritance. Interface — pure contract, multiple inheritance.
Analogy: Abstract class = partially built house. Interface = building code.
Abstract class:
abstract keyword.1abstract class Animal {2 protected String name;34 public Animal(String name) {5 this.name = name;6 }78 public void sleep() {9 System.out.println(name + " sleeping");10 }1112 public abstract void makeSound();13}1415class Dog extends Animal {16 public Dog(String name) { super(name); }1718 @Override19 public void makeSound() {20 System.out.println("Bark!");21 }22}2324Dog d = new Dog("Rex");25d.sleep(); // Rex sleeping26d.makeSound(); // Bark!
Interface:
interface keyword.public abstract by default.default/static methods.1interface Swimmable {2 void swim();34 default void float_() {5 System.out.println("Floating");6 }7}89interface Flyable {10 void fly();11}1213class Duck extends Animal implements Swimmable, Flyable {14 public Duck(String name) { super(name); }1516 @Override17 public void makeSound() { System.out.println("Quack!"); }1819 @Override20 public void swim() { System.out.println("Swimming"); }2122 @Override23 public void fly() { System.out.println("Flying"); }24}2526Duck duck = new Duck("Donald");27duck.swim(); // Swimming28duck.fly(); // Flying29duck.float_(); // Floating (default)
Differences:
Use abstract class for shared state. Use interface for capabilities.