DevNotes
Support
Core Java · Chapter 11

Sealed Classes (Java 17+)

Controlled inheritance with permits, final, sealed and non-sealed, and how it pairs with pattern matching.

◷ 5 min read§ 21 sections? 10 interview questions{ } 17 code examples

#Introduction

Sealed Classes are one of the most important features introduced in modern Java. They were introduced as a preview in Java 15 and became a standard feature in Java 17 (LTS).

A Sealed Class allows you to control which classes are allowed to extend or implement it.

Before Sealed Classes, any class could freely extend another class:

Java
class Animal {
}
class Dog extends Animal {
}
class Cat extends Animal {
}
class Lion extends Animal {
}
class Tiger extends Animal {
}

There is no restriction. Sometimes this is undesirable. Java introduced Sealed Classes to solve this problem.

#What is a Sealed Class?

A Sealed Class restricts inheritance. Only the explicitly permitted classes can extend it.

Java
public sealed class Vehicle
        permits Car, Bike, Truck {

}

Only Car, Bike and Truck can extend Vehicle. Any other class trying to extend it results in a compilation error.

#Why Do We Need Sealed Classes?

Imagine a banking application:

  • Account
    • SavingsAccount
    • CurrentAccount
    • LoanAccount
These are the only valid account types

You don't want developers creating CryptoAccount, FakeAccount or UnknownAccount. Sealed classes prevent unauthorized inheritance.

#Syntax

Java
public sealed class Animal
        permits Dog, Cat {

}

Permitted subclasses:

Java
final class Dog extends Animal {
}
final class Cat extends Animal {
}

#Rules of Sealed Classes

Every permitted subclass must declare one of these modifiers:

  • final
  • sealed
  • non-sealed

This is mandatory.

1. final

Inheritance stops completely.

Java
public sealed class Animal
        permits Dog {

}

public final class Dog
        extends Animal {
}

Now:

Java
class Puppy extends Dog {   // Compilation Error
}

2. sealed

Inheritance continues, but remains controlled.

Java
public sealed class Animal
        permits Dog {

}

public sealed class Dog
        extends Animal
        permits Labrador, Pug {

}

Only Labrador and Pug may extend Dog.

3. non-sealed

Inheritance becomes unrestricted again.

Java
public sealed class Animal
        permits Dog {

}

public non-sealed class Dog
        extends Animal {
}

Now both of these are allowed:

Java
class Labrador extends Dog {
}
class GermanShepherd extends Dog {
}

#Complete Hierarchy

  • Animalsealed
    • Dogsealed
      • Labrador
      • Pug
    • Catfinal

#Sealed Interfaces

Interfaces can also be sealed.

Java
public sealed interface Payment
        permits CardPayment,
                UpiPayment,
                WalletPayment {

}

Implementation:

Java
public final class CardPayment
        implements Payment {

}

#Reflection Support

Check whether a class is sealed:

Java
System.out.println(
        Vehicle.class.isSealed()
);
Output
true

Get permitted subclasses:

Java
Vehicle.class.getPermittedSubclasses();

Useful for frameworks and code analysis tools.

#Sealed Classes with Switch

Sealed classes work well with pattern matching.

Java
public sealed interface Shape
        permits Circle, Rectangle {

}

public final class Circle
        implements Shape {

}

public final class Rectangle
        implements Shape {

}

Because all possible subclasses are known, the compiler can verify switch exhaustiveness.

#Sealed Class vs final Class

Sealedfinal
Allows limited inheritanceNo inheritance
Controlled hierarchyCompletely closed
FlexibleCompletely restricted

#Sealed Class vs Abstract Class

Abstract ClassSealed Class
Controls object creationControls inheritance
Can be extended by any subclassOnly permitted subclasses
May be instantiated through subclassesSame, but inheritance is restricted

A class can be both abstract and sealed:

Java
public abstract sealed class Vehicle
        permits Car, Bike {

}

#Sealed Class vs Enum

EnumSealed Class
Fixed constantsFixed subclasses
Represents valuesRepresents types
Singleton instancesMultiple object instances

Enum:

Java
enum Status {
    ACTIVE,
    INACTIVE
}

Sealed:

Java
sealed class Shape
        permits Circle, Rectangle {

}

#Real Project Examples

  • Payment
    • CardPayment
    • UPIPayment
    • WalletPayment
Payment System: no unknown payment implementations
  • Notification
    • SMS
    • EMAIL
    • PUSH
Notification System
  • Vehicle
    • Car
    • Bike
    • Truck
Vehicle Management
  • Account
    • Savings
    • Current
    • Loan
Banking

Compiler AST

Compilers often use sealed hierarchies because the set of node types is fixed.

#Advantages

  • Controlled inheritance
  • Better API design
  • Improved readability
  • Safer object hierarchies
  • Better support for pattern matching
  • Easier maintenance

#Limitations

  • Permitted subclasses must follow module/package rules (same module, or same package in the unnamed module).
  • More restrictive than normal inheritance.
  • Not suitable when third-party extensions are expected.

#Interview Questions

Q1What is a Sealed Class?

A class that restricts which classes can inherit from it.

Q2Which Java version standardized Sealed Classes?

Java 17.

Q3Which keyword specifies allowed subclasses?

permits

Q4Which modifiers are allowed on permitted subclasses?
  • final
  • sealed
  • non-sealed
Q5Can a Sealed Class be instantiated?

Yes, unless it is also declared abstract.

Q6Can interfaces be sealed?

Yes. Both classes and interfaces can be sealed.

Q7Can a permitted subclass omit final, sealed, or non-sealed?

No. One of them is mandatory.

Q8Can a Sealed Class extend another class?

Yes. It follows normal inheritance rules while controlling its own subclasses.

Q9Can a Sealed Class be abstract?

Yes. This is a common design.

Q10When should we use Sealed Classes?

When the number of valid subclasses is fixed and controlled, such as payment types, account types, workflow states, or domain models.

#Common Mistakes

  • Forgetting the permits clause.
  • Forgetting to declare permitted subclasses as final, sealed, or non-sealed.
  • Using sealed classes when unrestricted extension is required.
  • Confusing Sealed Classes with Enums.

#Best Practices

  • Use Sealed Classes for controlled domain hierarchies.
  • Use final when inheritance should stop.
  • Use sealed for another controlled level.
  • Use non-sealed only when open inheritance is intentionally required.
  • Combine Sealed Classes with pattern matching and modern switch expressions where appropriate.

#Quick Revision

Sealed Class
permits
Allowed Subclasses
final · sealed · non-sealed
Controlled Inheritance
Better API Design

#Interview Cheat Sheet

RequirementRecommendation
No inheritancefinal
Limited inheritancesealed
Reopen inheritancenon-sealed
Restrict implementationsSealed Interface
Fixed domain hierarchySealed Class

#Chapter Summary

After completing this chapter, you should be able to:

  • Explain what Sealed Classes are and why they were introduced.
  • Create Sealed Classes and Sealed Interfaces.
  • Use permits, final, sealed, and non-sealed correctly.
  • Compare Sealed Classes with Abstract Classes, Enums, and Final Classes.
  • Design controlled inheritance hierarchies for enterprise applications.
  • Confidently answer Java 17 Sealed Class interview questions.