// *** 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 Circle, Square { }
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());