Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

FeatureInterfaceAbstract Class
DefinitionA contract with abstract methods, default methods, static methods, and constants.A class with abstract and/or concrete methods, fields, and constructors.
Keywordinterfaceabstract class
InstantiationCannot be instantiated.Cannot be instantiated.
MethodsAbstract methods (implicitly public), default methods, static methods.Abstract and concrete methods (any access modifier).
FieldsOnly public, static, final fields (constants).Can have instance fields (state) with any access modifier.
ConstructorsNo constructors.Can have constructors for initialization.
InheritanceA class can implement multiple interfaces (implements).A class can extend only one abstract class (extends).
Multiple InheritanceSupported (via multiple interfaces).Not supported (single inheritance for classes).
Access ModifiersMethods are implicitly public.Methods/fields can be public, protected, private, or default.
StateStateless (no instance fields).Can maintain state (instance fields).
Use CaseDefine a contract or role (e.g., Comparable, Runnable).Provide partial implementation and shared state (e.g., Vehicle with fields).
PolymorphismSupports polymorphism (interface reference to implementing class).Supports polymorphism (abstract class reference to subclass).
Examplejava<br>interface Flyable {<br> void fly();<br>}<br>java<br>abstract class Animal {<br> abstract void sound();<br> void sleep() { ... }<br>}<br>
interface Drawable {
    void draw();
    default void describe() {
        System.out.println("This is a drawable object.");
    }
}

abstract class Shape {
    String color;

    Shape(String color) {
        this.color = color;
    }

    abstract double getArea();

    String getColor() {
        return color;
    }
}

class Circle extends Shape implements Drawable {
    double radius;

    Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }

    @Override
    double getArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public void draw() {
        System.out.println("Drawing a " + getColor() + " circle.");
    }
}

class Main {
    public static void main(String[] args) {
        Circle circle = new Circle("Red", 5);
        circle.draw();        // Output: Drawing a Red circle.
        circle.describe();    // Output: This is a drawable object.
        System.out.println("Area: " + circle.getArea()); // Output: Area: 78.53981633974483
    }
}