Sealed Classes in Java 17

Sealed classes allow inheritance to only selected classes. In the below class, PassengerVehicle class can only be extended by Car and Vehicle classes. Any other class cannot extend it.

PassengerVehicle class

package com.sks;

public sealed class PassengerVehicle permits Car, Bike {
	
	public void drive() {
		System.out.println("Vehicle is driven....");
	}

}

Car class

package com.sks;

public final class Car extends PassengerVehicle {
	
	public void drive() {
		System.out.println("The car is driven...");
	}

}

Bike class

package com.sks;

public final class Bike extends PassengerVehicle  {
	
	public void drive() {
		System.out.println("The bike is ridden");
	}

}

Note that these child classes Car and Bike are final classes. That means they can’t be extended further. But if you make them non-sealed instead of final, they will be allowed to be extended.

package com.sks;

public non-sealed class Bike extends PassengerVehicle  {
	
	public void drive() {
		System.out.println("The bike is ridden");
	}

}

Now, EBike class can extend this Bike class

package com.sks;

public class EBike extends Bike {
	
	public void drive() {
		System.out.println("E bike is driven by battery");
	}

}

Point to remember

Direct subclasses of a sealed-class must declare themselves as either final, sealed or non-sealed to specify explicitly what happens to them after they are inherited.