Как сделать модуль в java

Обновлено: 06.07.2024

Класс Math содержит методы для выполнения основных числовых операций, таких как нахождение экспоненты, логарифма, квадратного корня и т. д.

Класс содержит две константы типа double: E и PI. Все методы в классе Math статичны.

ТипМетодОписание
doubleabs(double a)Возвращает абсолютное значение (модуль) числа типа double.
floatabs(float a)Возвращает абсолютное значение (модуль) числа типа float .
intabs(int a)Возвращает абсолютное значение (модуль) числа типа int.
longabs(long a)Возвращает абсолютное значение (модуль) числа типа long.
doubleacos(double a)Возвращает арккосинус значения. Возвращенный угол находится в диапазоне от 0 до pi.
doubleasin(double a)Возвращает арксинус значения. Возвращенный угол в диапазоне от -pi/2 до pi/2.
doubleatan(double a)Возвращает арктангенс значения. Возвращенный угол в диапазоне от-pi/2 до pi/2.
doublecbrt(double a)Возвращает кубический корень аргумента.
doubleceil(double a)Возвращает наименьшее целое число, которое больше аргумента.
doublecopySign(double magnitude, double sign)Возвращает аргумент с тем же знаком, что у второго аргумента.
doublecopySign(float magnitude, float sign)Возвращает аргумент с тем же знаком, что у второго аргумента.
doublecos(double a)Возвращает косинус аргумента.
doublecosh(double x)Возвращает гиперболический косинус аргумента.
intdecrementExact(int a)Возвращает значение аргумента уменьшенное на единицу.
longdecrementExact(long a)Возвращает значение аргумента уменьшенное на единицу.
doubleexp(double a)Возвращает экспоненту аргумента.
doublefloor(double a)Возвращает наибольшее целое число, которое меньше или равно аргументу.
doublehypot(double x, double y)Возвращает длину гипотенузы (sqrt(x 2 +y 2 )).
doubleIEEEremainder(double f1, double f2)Возвращает остаток от деления f1 на f2.
intincrementExact(int a)Возвращает значение аргумента увеличенное на единицу.
longincrementExact(long a)Возвращает значение аргумента увеличенное на единицу.
doublelog(double a)Возвращает натуральный логарифм (по основанию e).
doublelog10(double a)Возвращает логарифм по основанию 10.
doublemax(double a, double b)Возвращает больший из аргументов.
floatmax(float a, float b)Возвращает больший из аргументов.
intmax(int a, int b)Возвращает больший из аргументов.
longmax(long a, long b)Возвращает больший из аргументов.
doublemin(double a, double b)Возвращает меньший из аргументов.
floatmin(float a, float b)Возвращает меньший из аргументов.
intmin(int a, int b)Возвращает меньший из аргументов.
longmin(long a, long b)Возвращает меньший из аргументов.
intmultiplyExact(int x, int y)Возвращает произведение аргументов (x*y).
longmultiplyExact(long x, long y)Возвращает произведение аргументов (x*y).
intnegateExact(int a)Возвращает отрицательное значение аргумента.
longnegateExact(long a)Возвращает отрицательное значение аргумента.
doublepow(double a, double b)Возвращает значение первого аргумента, возведенное в степень второго аргумента.
doublerandom()Возвращает случайное число от 0.0 (включительно) до 1 (не включительно).
doublerint(double a)Возвращает округленное значение аргумента.
intround(double a)Возвращает округленное значение аргумента.
doublesignum(double a)Возвращает знак аргумента.
floasignum(float a)Возвращает знак аргумента.
doublesin(double a)Возвращает синус аргумента.
doublesinh(double a)Возвращает гиперболический синус аргумента.
doublsqrt(double a)Возвращает квадратный корень аргумента.
intsubtractExact(int x, int y)Возвращает разность аргументов (x-y).
longsubtractExact(long x, long y)Возвращает разность аргументов (x-y).
doubletan(double a)Возвращает тангенс аргумента.
doubletanh(double a)Возвращает гиперболический тангенс аргумента.
doubltoDegrees()Преобразует радианы в градусы.
inttoIntExact(long value)Преобразует аргумент типа long в int.
doubltoRadians()Преобразует градусы в радианы.

abs(double a) — возвращает абсолютное значение (модуль) числа типа double.

abs(float a) — возвращает абсолютное значение (модуль) числа типа float .

abs(int a) — возвращает абсолютное значение (модуль) числа типа int.

abs(long a) — возвращает абсолютное значение (модуль) числа типа long.

acos(double a) — возвращает арккосинус значения. Возвращенный угол находится в диапазоне от 0 до pi.

asin(double a) — возвращает арксинус значения. Возвращенный угол в диапазоне от -pi/2 до pi/2.

atan(double a) — возвращает арктангенс значения. Возвращенный угол в диапазоне от-pi/2 до pi/2.

cbrt(double a) — возвращает кубический корень аргумента.

ceil(double a) — возвращает наименьшее целое число, которое больше аргумента.

copySign(double magnitude, double sign) — возвращает аргумент с тем же знаком, что у второго аргумента.

copySign(float magnitude, float sign) — возвращает аргумент с тем же знаком, что у второго аргумента.

cos(double a) — возвращает косинус аргумента.

cosh(double x) — возвращает гиперболический косинус аргумента.

decrementExact(int a) — возвращает значение аргумента уменьшенное на единицу.

decrementExact(long a) — возвращает значение аргумента уменьшенное на единицу.

exp(double a) — возвращает экспоненту аргумента.

floor(double a) — возвращает наибольшее целое число, которое меньше или равно аргументу.

hypot(double x, double y) — возвращает длину гипотенузы (sqrt(x 2 +y 2 )).

IEEEremainder(double f1, double f2) — возвращает остаток от деления f1 на f2.

incrementExact(int a) — возвращает значение аргумента увеличенное на единицу.

incrementExact(long a) — возвращает значение аргумента увеличенное на единицу.

log(double a) — возвращает натуральный логарифм (по основанию e).

log10(double a) — возвращает логарифм по основанию 10.

max(double a, double b) — возвращает больший из аргументов.

max(float a, float b) — возвращает больший из аргументов.

max(int a, int b) — возвращает больший из аргументов.

max(long a, long b) — возвращает больший из аргументов.

min(double a, double b) — возвращает меньший из аргументов.

min(float a, float b) — возвращает меньший из аргументов.

min(int a, int b) — возвращает меньший из аргументов.

min(long a, long b) — возвращает меньший из аргументов.

multiplyExact(int x, int y) — возвращает произведение аргументов (x*y).

multiplyExact(long x, long y) — возвращает произведение аргументов (x*y).

negateExact(int a) — возвращает отрицательное значение аргумента.

negateExact(long a) — возвращает отрицательное значение аргумента.

pow(double a, double b) — возвращает значение первого аргумента, возведенное в степень второго аргумента (a b )

random() — возвращает случайное число от 0.0 (включительно) до 1 (не включительно).

rint(double a) — возвращает округленное значение аргумента.

round(double a) — возвращает округленное значение аргумента.

signum(double a) — возвращает знак аргумента.

signum(float a) — возвращает знак аргумента.

sin(double a) — возвращает синус аргумента.

sinh(double a) — возвращает гиперболический синус аргумента.

sqrt(double a) — возвращает квадратный корень аргумента.

subtractExact(int x, int y) — возвращает разность аргументов (x-y).

subtractExact(long x, long y) — возвращает разность аргументов (x-y).

tan(double a) — возвращает тангенс аргумента.

tanh(double a) — возвращает гиперболический тангенс аргумента.

toDegrees() — преобразует радианы в градусы.

toIntExact(long value) — преобразует аргумент типа long в int.

6 сентября 2014 Мария (admin)

В уроке 8 мы затронули логические операторы, они нам были необходимы для формирования логического выражения в условиях if. Этот урок будет посвящен математике в Java, и поэтому мы рассмотрим подробнее арифметические операторы и частично возможности класса Math.

Но для начала, выясним, что же такое операторы. Операторы это специальные символы, отвечающие за ту или иную операцию, например сложение, умножение, сравнение. Все операторы в Java можно разбить на 4 класса — арифметические, битовые, операторы сравнения и логические.

Арифметические операторы в Java

Для стандартных арифметических операций, таких как сложение, вычитание, умножение, деление в Java используются традиционные символы, к которым мы привыкли со школы:

Примечание: при операции деления, если оба аргумента являются целыми числами, то в результате получим целое число. Дробная часть, если такая имеется, отбросится. Если хотим получить число с дробной частью, то нужно, чтобы один из аргументов был типа double. Это можно указать в самом выражении при помощи добавления после числа .0 или .d. Пример:

В Java также имеется специальный оператор %, обозначающий остаток от делния.

Пример использования: дан массив целых чисел, вывести на консоль только те числа, которые делятся на 3.

Операции с присваиванием

Рассмотрим задачу вывода на экран 10 первых четных чисел чисел

мы можем записать сокращенно

+= это оператор сложения с присваиванием. Подобные операторы есть для всех основных 5 операций, рассмотренных выше

Пример использования: Найти факториал числа 7.

Инкрементирование и декрементирование

Инкремент, обозначается ++ и увеличивает значение переменной на единицу. Декремент обозначается — и уменьшает значение на единицу. С инкрементом и декрементом мы часто встречаемся в цикле for.

Инкремент и декремент бывают двух форм

Различие префиксной и постфиксной формы проявляется только тогда, когда эти операции присутствуют в выражениях. Если форма префиксная, то сначала произойдет увеличение (или уменьшение) переменной на единицу, а потом с новым значением будет произведены дальнейшие вычисления. Если форма постфиксная, то расчет выражения будет происходить со старым значением переменной, а переменная увеличится (или уменьшится) на единицу после вычисления выражения. Пример

В первом случае сначала переменная a увеличится на 1, потом произойдет вычисление всего выражения. Во втором случае произойдет вычисление выражения при старом значении b = 3, и после вычисления b увеличится на 1, на результат в postfix это уже не повлияет.

Если вы поняли принцип работы постфиксного и префиксного инкремента/декремента, то предлагаю решить в уме такую задачу:

Вопрос: чему в итоге равны x и y? После того, как вы сделали предположение, проверьте его в java.

Задача со зведочкой. Дан код:

Какие числа будут выведены на экран? Почему? Разобраться самостоятельно.

Примечание: инкремент и декремент применяются только к переменной. Выражение вида 7++ считается недопустимым.

Математические функции и константы (класс Math)

Для решения задач нередко требуется использование математических функций. В Java такие функции включены в класс Math. Для того, чтобы использовать методы класса Math, нужно подключить его в начале .java файла с вашим кодом.

Часто используемые математические функции

  • sqrt(a) — извлекает квадратный корень из числа а.
  • pow(a, n)a возводится в степень n.
  • sin(a), cos(a), tan(a) — тригонометрические функции sin, cos и tg угла a указанного в радианах.
  • asin(n), acos(n), atan(n) — обратные тригонометрические функции, возвращают угол в радианах.
  • exp(a) — возвращает значение экспоненты, возведенной в степень a.
  • log(a) — возвращает значение натурального логарифма числа a.
  • log10(a) — возвращает значение десятичного логарифма числа a.
  • abs(a) — возвращает модуль числа a.
  • round(a) — округляет вещественное число до ближайшего целого.

Константы

Упражнения

  1. Дан массив целых чисел, найти среди элементов массива числа, которые делятся на 3 и на 6
  2. Посчитать среднее арифметическое чисел в массиве
  3. Известны катеты прямоугольного треугольника, найти его площадь и периметр
  4. Даны два целых числа, найти их наибольший общий делитель и наименьшее общее кратное
  5. Даны радиус вращения и высота конуса, вычислить объем конуса.


Категория: Уроки Java

Комментариев к записи: 13

Почему в выражении y = —y — y—; decrement со знаком минуса не срабатывает, а с плюсом работает?

не знаю почему у вас не срабатывает.. все должно срабатывать.

Проверил действие кода на другом языке(AS3), результат был тот же. Значит это не ошибка, а просто особенность выполнения этих математических действий.

Здравствуйте,
в первом задании можно было 1 цикл использовать с условием if(arr[i]%3==0 && arr[i]%6==0) Проверку на >0 делать не обязательно. При поиске среднего арифметического можно бы было сразу работаться типом double. 4 задание не учтен случай, если числа равны. Еще как вариант, в случае n2>n1, можно значения n2 и n1 поменять местами, чтобы не писать потом один и тот же код 2 раза.

Вы можете использовать модули Azure IoT Edge для развертывания кода, который реализует бизнес-логику непосредственно на устройствах IoT Edge. В этом руководстве рассматриваются создание и развертывание модуля IoT Edge, который фильтрует данные датчика. Вы будете использовать имитированное устройство IoT Edge, созданное с помощью процедур развертывания Azure IoT Edge на имитированном устройстве, описанных в кратких руководствах. В этом руководстве описано следующее:

  • Использовать Visual Studio Code для создания модуля IoT Edge Java на основе пакета шаблонов Maven для Azure IoT Edge и пакета SDK для устройств Интернета вещей Azure для Java.
  • Использовать Visual Studio Code и Docker для создания образа Docker и его публикации в реестре.
  • Развертывать модуль на устройстве IoT Edge.
  • Просматривать сформированные данные.

Если у вас нет подписки Azure, создайте бесплатную учетную запись Azure , прежде чем начинать работу.

Предварительные требования

В этом учебнике показано, как разработать модуль на Java с помощью Visual Studio Code и развернуть его на устройстве IoT Edge. IoT Edge не поддерживает модули Java, собранные в виде контейнеров Windows.

В следующей таблице перечислены возможные варианты для разработки и развертывания модулей Java.

Java Visual Studio Code Visual Studio 2017 или 2019
Linux AMD64 Use VS Code for Java modules on Linux AMD64
Linux ARM32

Предполагается, что перед началом работы с этим руководством вы прошли предыдущее, в рамках которого настроили окружение для разработки контейнеров Linux: Tutorial: Develop IoT Edge modules for Linux devices (Руководство. Разработка модулей IoT Edge для устройств с Linux). После работы с любым из учебников у вас должны быть готовы все необходимые компоненты:

    ценовой категории "Бесплатный" или "Стандартный" в Azure.
  • Устройство, на котором выполняется Azure IoT Edge с контейнерами Linux. Вы можете воспользоваться краткими руководствами для настройки устройства Linux или Windows.
  • реестр контейнеров, например Реестр контейнеров Azure;
  • средство Visual Studio Code, настроенное с помощью Azure IoT Tools;
  • выпуск Docker CE, настроенный для выполнения контейнеров Linux.

Для разработки модуля IoT Edge на языке Java установите на компьютере разработки следующие дополнительные компоненты.

Пакет SDK для Java SE 11 и переменная среды , которая указывает на эту установку JDK.

В процессе установки Java и Maven в систему добавляются переменные среды. После завершения установки перезапустите все открытые терминалы Visual Studio Code, PowerShell или экземпляры командной строки. Это позволит гарантировать правильную обработку команд Java и Maven такими средствами.

Создание проекта модуля

Ниже описана процедура создания проекта модуля IoT Edge на основе пакета шаблонов Maven для Azure IoT Edge и пакета SDK для устройств Интернета вещей Azure для Java. Для создания проекта используется Visual Studio Code и средства Azure IoT.

Создание нового проекта

Создайте шаблон решения Java, в который вы сможете поместить собственный код.

в Visual Studio Code выберите представление палитра команд , чтобы открыть палитру команд VS Code.

В палитре команд введите и выполните команду Azure IoT Edge: New IoT Edge Solution (Azure IoT Edge: создать решение IoT Edge). Следуйте инструкциям на экране в палитре команд для создания решения.

Provide Docker image repository

Если вы создаете модуль Java впервые, скачивание пакетов Maven может занять некоторое время. Как только решение будет готово, это окно VS Code откроет рабочую область решения IoT Edge. Рабочая область решения содержит пять компонентов верхнего уровня.

  • Папка modules содержит код Java для модуля и файлы Docker для создания модуля в качестве образа контейнера.
  • В файле . env хранятся учетные данные реестра контейнеров.
  • Файл deployment.template.json содержит сведения, которые среда выполнения IoT Edge использует для развертывания модулей на устройстве.
  • Файл deployment.debug.template.json содержит отладочные версии модулей.
  • Вы не сможете изменить файл vscode или gitignore в этом руководстве.

Если вы не указали реестр контейнеров при создании решения, но приняли значение по умолчанию localhost: 5000, у вас не будет файла. env.

Добавление учетных данных реестра

Файл среды хранит учетные данные для реестра контейнеров и совместно использует их со средой выполнения IoT Edge. Среде выполнения нужны эти учетные данные, чтобы извлечь частный образ на устройство IoT Edge.

Расширение IoT Edge пытается извлечь учетные данные реестра контейнеров из Azure и заполнить их в файле среды. Проверьте, включены ли ваши учетные данные. В противном случае добавьте их:

  1. Откройте в обозревателе VS Code файл с расширением ENV.
  2. Обновите поля с именем пользователя и паролем, скопированные из своего реестра контейнера Azure.
  3. Сохраните этот файл.

При работе с этим руководством используются учетные данные администратора для Реестра контейнеров Azure, что удобно для сценариев разработки и тестирования. Но после перехода в рабочую среду рекомендуется использовать для проверки подлинности вариант с минимальными правами, например субъект-службу. Дополнительные сведения см. в разделе Управление доступом к реестру контейнеров.

Выбор целевой архитектуры

Сейчас Visual Studio Code позволяет разрабатывать модули Java для устройств Linux AMD64 и Linux ARM32v7. Для каждого решения вам нужно выбрать одну целевую платформу, так как сборка и запуск контейнера для разных архитектур различается. По умолчанию используется Linux AMD64.

Откройте палитру команд и выполните поиск Azure IoT Edge: Set Default Target Platform for Edge Solution (Azure IoT Edge: установить целевую платформу по умолчанию для решения Edge) или выберите значок ярлыка на боковой панели в нижней части окна.

В палитре команд выберите целевую архитектуру из списка параметров. В рамках этого руководства мы используем в качестве устройства IoT Edge виртуальную машину Ubuntu. Поэтому сохраним значение по умолчанию amd64.

Обновление модуля с помощью пользовательского кода

в обозревателе VS Code откройте модули жавамодуле src main java com еджемодуле App. java.

Добавьте в начало файла следующий код, который импортирует новые ссылочные классы.

Добавьте следующее определение в класс App. Эта переменная устанавливает пороговое значение температуры. Измеренное значение температуры компьютера отправляется в Центр Интернета вещей, только если оно превышает порог.

Добавьте следующие два внутренних статических класса в класс App. Эти классы обновляют переменную tempThreshold при изменении требуемого свойства двойника модуля. У каждого модуля есть собственный модуль-двойник, что позволяет настроить код, выполняемый в модуле, непосредственно из облака.

Добавьте следующие строки в метод main после строки client.open() , чтобы подписаться на обновления двойника модуля.

Сохраните файл App.java.

В обозревателе VS Code откройте файл deployment.template.json в рабочей области решения IoT Edge.

Добавьте двойник модуля JavaModule в манифест развертывания. Вставьте следующее содержимое JSON в нижней части раздела moduleContent после двойника модуля $edgeHub:

Add module twin to deployment template

Сохраните файл deployment.template.json.

Сборка и отправка модуля

откройте VS Code интегрированный терминал, выбрав вид терминал.

Войдите в Docker. Для этого введите представленную ниже команду в окне терминала. Выполните вход в систему, используя имя пользователя, пароль и сервер входа из реестра контейнеров Azure. Вы можете получить эти значения в разделе Ключи доступа в разделе реестра на портале Azure.

Возможно, появится предупреждение системы безопасности, в котором рекомендуется использовать --password-stdin . Для рабочих сценариев это лучшая методика, но мы не будем рассматривать ее в этом учебнике. Дополнительные сведения см. в описании команды docker login в справочнике.

Эта команда сборки и отправки позволяет запустить три операции. Во-первых, в решении создается папка с именем config, которая содержит полный манифест развертывания на основе информации из шаблона развертывания и других файлов решения. Во-вторых, выполняется docker build для сборки образа контейнера на основе подходящего файла dockerfile для целевой архитектуры. В-третьих, выполняется docker push для отправки образа в реестр контейнеров.

В первый раз выполнение этого процесса может занять несколько минут, но при следующем запуске команд он будет быстрее.

Развертывание модулей на устройстве

Разверните проект модуля на устройстве IoT Edge с помощью обозревателя Visual Studio Code и расширения Azure IoT Tools. У вас уже есть манифест развертывания, подготовленный для вашего сценария (файл deployment.amd64.json в папке config). Теперь вам осталось выбрать устройство для получения развертывания.

Убедитесь, что устройство IoT Edge работает.

В обозревателе Visual Studio Code в разделе Центр Интернета вещей Azure разверните меню Устройства, чтобы отобразить список устройств Интернета вещей.

Щелкните имя устройства IoT Edge правой кнопкой мыши, а затем выберите Create Deployment for Single Device (Создание развертывания для одного устройства).

Выберите файл deployment.amd64.json в папке config и щелкните Select Edge Deployment Manifest (Выбрать манифест развертывания Edge). Не используйте файл deployment.template.json.

На запуск модулей может потребоваться несколько минут. Среда выполнения IoT Edge должна получить новый манифест развертывания, извлечь образы модулей из среды выполнения контейнеров, а затем запустить каждый новый модуль.

Просмотр созданных данных

Когда вы примените манифест развертывания к устройству IoT Edge, в среде выполнения IoT Edge на устройстве начнется сбор сведений о новом развертывании и выполнение операций. Работа всех выполняющихся на устройстве модулей, которые не включены в манифест развертывания, будет остановлена. А модули, которых нет на устройстве, будут запущены.

В обозревателе Visual Studio Code щелкните имя устройства IoT Edge правой кнопкой мыши и выберите Start Monitoring Built-in Event Endpoint (Начать мониторинг строенной конечной точки событий).

Изменение двойника модуля

Мы использовали двойник модуля JavaModule в манифесте развертывания, чтобы задать порог температуры на уровне 25 градусов. С помощью двойника модуля вы можете изменять функциональные возможности без необходимости обновлять код модуля.

В Visual Studio Code разверните окно подробных сведений об устройстве IoT Edge, чтобы просмотреть список выполняющихся модулей.

Щелкните JavaModule правой кнопкой мыши и выберите Edit module twin (Изменение двойника модуля).

В списке требуемых свойств найдите TemperatureThreshold. Измените его значение, увеличив температуру на 5 или 10 градусов относительно последней сообщаемой температуры.

Сохраните файл двойника модуля.

Щелкните правой кнопкой мыши в любой точки на панели редактирования двойника модуля и выберите Update module twin (Обновление двойника модуля).

Очистка ресурсов

Если вы планируете перейти к следующей рекомендуемой статье, можно сохранить созданные и повторно используемые ресурсы и конфигурации. Это же устройство IoT Edge также можно использовать в качестве тестового устройства.

В противном случае чтобы избежать расходов, можно удалить локальные конфигурации и ресурсы Azure, созданные в рамках этой статьи.

Удаление ресурсов Azure

Удаление ресурсов Azure и групп ресурсов является необратимым. Будьте внимательны, чтобы случайно не удалить не ту группу ресурсов или не те ресурсы. Если вы создали центр Интернета вещей в группе ресурсов, содержащей ресурсы, которые нужно сохранить, удалите только ресурс Центра Интернета вещей, не удаляя всю группу ресурсов.

Войдите на портал Azure и щелкните Группы ресурсов.

Выберите группу ресурсов, содержащую тестовые ресурсы IoT Edge.

Просмотрите список ресурсов, содержащихся в группе ресурсов. Если вы хотите удалить их все, щелкните Удалить группу ресурсов. Если вы хотите удалить только некоторые из них, щелкните нужные ресурсы отдельно.

Дальнейшие действия

В этом руководстве вы создали модуль IoT Edge, который фильтрует необработанные данные, созданные вашим устройством IoT Edge.

Перейдите к следующим руководствам, чтобы узнать, как Azure IoT Edge поможет развернуть облачные службы Azure для обработки и анализа данных на пограничном устройстве.

Основным нововведением Java 9 было именно введение модульности. Это означает, что у нас появился новый компонент под названием модуль.
Модуль включает в себя код, данные и имя, по которому мы можем его идентифицировать.

Для того чтобы создать модуль, нам необходимо выполнить следующие шаги:

Создать проект в нужной директории. В моём случае это выглядит следующим образом:

Внутри которой, необходимо создать файл module-info.java со следующим содержанием:

Создать класс Main:

Java9ModuleStructure

Зайти в директорию проекта и создать пакет с именем mods.
Внутри этого проекта создаём директорию с именем нашего модуля.
В результате мы должны получить проект со следующей структурой:

Шаг 5
Компилируем модуль в директорию mods:

Шаг 6:
Запускаем модуль:

В результате выполнения данной команды мы должны получить следующее:

На этом мы заканчиваем разбор модульности в Java 9.
В следующей статье мы рассмотрим приватные методы в интерфейсах.

Читайте также: