// Sealed class
public sealed class Shape
permits Circle, Rectangle, Triangle {
public abstract double area();
}
// Final subclass (cannot be extended)
public final class Circle extends Shape {
private final double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
// Final subclass
public final class Rectangle extends Shape {
private final double width, height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}
// Non-sealed subclass (can be extended)
public non-sealed class Triangle extends Shape {
protected double base, height;
public Triangle(double base, double height) {
this.base = base;
this.height = height;
}
@Override
public double area() {
return 0.5 * base * height;
}
}
// Can extend non-sealed class
public class EquilateralTriangle extends Triangle {
private double side;
public EquilateralTriangle(double side) {
super(side, side * Math.sqrt(3) / 2);
this.side = side;
}
}
// Sealed interface
public sealed interface Expression
permits Constant, Variable, Addition, Multiplication {
double evaluate();
}
public final class Constant implements Expression {
private final double value;
public Constant(double value) {
this.value = value;
}
@Override
public double evaluate() {
return value;
}
}
public final class Variable implements Expression {
private final String name;
private final double value;
public Variable(String name, double value) {
this.name = name;
this.value = value;
}
@Override
public double evaluate() {
return value;
}
}
public record Addition(Expression left, Expression right) implements Expression {
@Override
public double evaluate() {
return left.evaluate() + right.evaluate();
}
}
public record Multiplication(Expression left, Expression right) implements Expression {
@Override
public double evaluate() {
return left.evaluate() * right.evaluate();
}
}