Ключевое слово sealed
Ключевое слово sealed применяется при объявлении класса
или интерфейса и разрешает наследование только строго
определенному набору классов. Классы, которым разрешено
наследоваться, перечисляются после ключевого слова
permits. Каждый разрешенный наследник обязан быть
помечен одним из трех модификаторов: final,
sealed или non-sealed. Если наследник не
указан в списке permits, компилятор выдаст ошибку.
Класс, помеченный sealed, сам по себе может быть
абстрактным или обычным, но не может быть унаследован
произвольными классами.
Синтаксис
public sealed class Name permits Sub1, Sub2, Sub3
{
// body
}
Пример
Давайте объявим запечатанный класс Shape, от которого
могут наследоваться только Circle и Square:
public class Main
{
public static void main(String[] args)
{
Shape circle = new Circle(5);
Shape square = new Square(4);
System.out.println(circle.area());
System.out.println(square.area());
}
}
sealed abstract class Shape permits Circle, Square
{
public abstract double area();
}
final class Circle extends Shape
{
private double radius;
public Circle(double radius)
{
this.radius = radius;
}
public double area()
{
return Math.PI * radius * radius;
}
}
final class Square extends Shape
{
private double side;
public Square(double side)
{
this.side = side;
}
public double area()
{
return side * side;
}
}
Результат выполнения кода:
78.53981633974483
16.0
Пример
Давайте создадим запечатанный интерфейс Vehicle,
который разрешает реализацию только классам Car и
Bike:
public class Main
{
public static void main(String[] args)
{
Vehicle car = new Car("abcde");
Vehicle bike = new Bike("12345");
System.out.println(car.info());
System.out.println(bike.info());
}
}
sealed interface Vehicle permits Car, Bike
{
String info();
}
final class Car implements Vehicle
{
private String model;
public Car(String model)
{
this.model = model;
}
public String info()
{
return "Car: " + model;
}
}
final class Bike implements Vehicle
{
private String model;
public Bike(String model)
{
this.model = model;
}
public String info()
{
return "Bike: " + model;
}
}
Результат выполнения кода:
"Car: abcde"
"Bike: 12345"
Пример
Давайте создадим иерархию, где наследник сам помечен
sealed и продолжает ограничивать наследование:
public class Main
{
public static void main(String[] args)
{
Shape shape = new Circle(3);
System.out.println(shape.area());
Shape rect = new Rectangle(2, 5);
System.out.println(rect.area());
}
}
sealed abstract class Shape permits Circle, Rectangle
{
public abstract double area();
}
sealed abstract class Rectangle extends Shape permits Square
{
protected double width;
protected double height;
public Rectangle(double width, double height)
{
this.width = width;
this.height = height;
}
public double area()
{
return width * height;
}
}
final class Square extends Rectangle
{
public Square(double side)
{
super(side, side);
}
}
final class Circle extends Shape
{
private double radius;
public Circle(double radius)
{
this.radius = radius;
}
public double area()
{
return Math.PI * radius * radius;
}
}
Результат выполнения кода:
28.274333882308138
10.0
Смотрите также
-
ключевое слово
permits,
которое задает список разрешенных наследников -
ключевое слово
non-sealed,
которое снимает ограничение наследования -
ключевое слово
final,
которое запрещает наследование -
ключевое слово
abstract,
которое создает абстрактный класс