Изменения в новых версиях / Java 17

// *** before: ***
// either a class was final and nobody could extend it, or it was open
// to the whole world:
abstract class ShapeOld { }
class CircleOld extends ShapeOld { }        // anyone, from anywhere

// *** in version 17: ***
sealed abstract class Shape permits CircleSquare { }

final class Circle extends Shape {          // final: the hierarchy ends here
    final double r;
    Circle(double r) { this.r = r; }
}
non-sealed class Square extends Shape { }   // non-sealed: open again
class Rect extends Square { }               // allowed, Square is non-sealed
// class Triangle extends Shape { }         // <- error: not in the permits list

Shape s = new Circle(2);
System.out.println(s.getClass().getSimpleName());