РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
59 of 1163 menu

Ключевое слово permits

Ключевое слово permits используется вместе с ключевым словом sealed и указывает явный список классов или интерфейсов, которым разрешено наследоваться от данного класса или реализовывать данный интерфейс. После слова permits через запятую перечисляются имена разрешённых наследников. Каждый наследник в списке должен быть либо final, либо sealed, либо non-sealed. Если все наследники объявлены в одном файле с родителем, ключевое слово permits можно опустить - компилятор выведет список автоматически.

Синтаксис

public sealed class Parent permits Child1, Child2 { }

Пример

Объявим sealed-класс Shape, который разрешает наследование только классам Circle и Square:

public class Main { public static void main(String[] args) { Shape circle = new Circle(); Shape square = new Square(); System.out.println(circle.name()); System.out.println(square.name()); } } sealed class Shape permits Circle, Square { public String name() { return "shape"; } } final class Circle extends Shape { @Override public String name() { return "circle"; } } final class Square extends Shape { @Override public String name() { return "square"; } }

Результат выполнения кода:

"circle" "square"

Пример

Если наследники объявлены в том же файле, что и sealed-класс, ключевое слово permits можно не писать - компилятор выведет разрешённых наследников сам:

public class Main { public static void main(String[] args) { Shape shape = new Triangle(); System.out.println(shape.name()); } } sealed class Shape { public String name() { return "shape"; } } final class Triangle extends Shape { @Override public String name() { return "triangle"; } }

Результат выполнения кода:

"triangle"

Пример

Ключевое слово permits работает и с sealed-интерфейсами. Разрешим реализацию интерфейса Animal только классам Cat и Dog:

public class Main { public static void main(String[] args) { Animal cat = new Cat(); Animal dog = new Dog(); System.out.println(cat.sound()); System.out.println(dog.sound()); } } sealed interface Animal permits Cat, Dog { String sound(); } final class Cat implements Animal { @Override public String sound() { return "meow"; } } final class Dog implements Animal { @Override public String sound() { return "woof"; } }

Результат выполнения кода:

"meow" "woof"

Смотрите также

  • ключевое слово sealed,
    которое запрещает наследование посторонним классам
  • ключевое слово non-sealed,
    которое открывает наследование от sealed-класса
  • ключевое слово final,
    которое запрещает наследование класса
  • ключевое слово extends,
    которое наследует класс от другого класса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить