Sealed Classes (Java 17+)
Controlled inheritance with permits, final, sealed and non-sealed, and how it pairs with pattern matching.
#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:
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.
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
You don't want developers creating CryptoAccount, FakeAccount or UnknownAccount. Sealed classes prevent unauthorized inheritance.
#Syntax
public sealed class Animal
permits Dog, Cat {
}Permitted subclasses:
final class Dog extends Animal {
}
final class Cat extends Animal {
}#Rules of Sealed Classes
Every permitted subclass must declare one of these modifiers:
finalsealednon-sealed
This is mandatory.
1. final
Inheritance stops completely.
public sealed class Animal
permits Dog {
}
public final class Dog
extends Animal {
}Now:
class Puppy extends Dog { // Compilation Error
}2. sealed
Inheritance continues, but remains controlled.
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.
public sealed class Animal
permits Dog {
}
public non-sealed class Dog
extends Animal {
}Now both of these are allowed:
class Labrador extends Dog {
}
class GermanShepherd extends Dog {
}#Complete Hierarchy
- Animalsealed
- Dogsealed
- Labrador
- Pug
- Catfinal
#Sealed Interfaces
Interfaces can also be sealed.
public sealed interface Payment
permits CardPayment,
UpiPayment,
WalletPayment {
}Implementation:
public final class CardPayment
implements Payment {
}#Reflection Support
Check whether a class is sealed:
System.out.println(
Vehicle.class.isSealed()
);trueGet permitted subclasses:
Vehicle.class.getPermittedSubclasses();Useful for frameworks and code analysis tools.
#Sealed Classes with Switch
Sealed classes work well with pattern matching.
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
| Sealed | final |
|---|---|
| Allows limited inheritance | No inheritance |
| Controlled hierarchy | Completely closed |
| Flexible | Completely restricted |
#Sealed Class vs Abstract Class
| Abstract Class | Sealed Class |
|---|---|
| Controls object creation | Controls inheritance |
| Can be extended by any subclass | Only permitted subclasses |
| May be instantiated through subclasses | Same, but inheritance is restricted |
A class can be both abstract and sealed:
public abstract sealed class Vehicle
permits Car, Bike {
}#Sealed Class vs Enum
| Enum | Sealed Class |
|---|---|
| Fixed constants | Fixed subclasses |
| Represents values | Represents types |
| Singleton instances | Multiple object instances |
Enum:
enum Status {
ACTIVE,
INACTIVE
}Sealed:
sealed class Shape
permits Circle, Rectangle {
}#Real Project Examples
- Payment
- CardPayment
- UPIPayment
- WalletPayment
- Notification
- SMS
- EMAIL
- PUSH
- Vehicle
- Car
- Bike
- Truck
- Account
- Savings
- Current
- Loan
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?
finalsealednon-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
permitsclause. - Forgetting to declare permitted subclasses as
final,sealed, ornon-sealed. - Using sealed classes when unrestricted extension is required.
- Confusing Sealed Classes with Enums.
#Best Practices
- Use Sealed Classes for controlled domain hierarchies.
- Use
finalwhen inheritance should stop. - Use
sealedfor another controlled level. - Use
non-sealedonly when open inheritance is intentionally required. - Combine Sealed Classes with pattern matching and modern switch expressions where appropriate.
#Quick Revision
#Interview Cheat Sheet
| Requirement | Recommendation |
|---|---|
| No inheritance | final |
| Limited inheritance | sealed |
| Reopen inheritance | non-sealed |
| Restrict implementations | Sealed Interface |
| Fixed domain hierarchy | Sealed 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, andnon-sealedcorrectly. - 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.