программы с исходным кодом java

ООП на Java примерах (OOP in Java examples)

У Вас уже должны быть установлены среда разработки приложений NetBeans и JDK (Java Development Kit).

Запустите NetBeans. В меню выберите File/NewProject/Java/ и введите pro1 в ответ на запрос имени проекта, а затем нажмите Finish. При этом будет создан файл Pro1.java с классом Pro1 и пустым методом main() в нем.

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Добавим следующий код в этот метод:

Для запуска программы выберем в меню Run /Run Project. В нижней панели отобразится результат работы программы:

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Простейшее оконное приложение

Построим изучение основ языка Java на аналогиях, сравнивая его с языком C++. В начале рассмотрим программы, подобные простейшим MFC приложениям.

Начнем с простого, создадим программу, которая показывает пустое окно.

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Исходный код программы:

Последовательность выполнения (обозначена 1-4) практически та же, что и для простейшего оконного MFC приложения. При разработке Java приложения программист использует базовые классы, строит производные от них классы. Проект программы может содержать несколько классов. Один из классов проекта содержит функцию main, которая есть точкой входа в программу. Имя класса должно совпадать с именем файла, в котором класс описан.

Java – полностью объектно-ориентированный язык, даже в большей степени, чем C++. Функции и переменные, не привязанные к контексту какого-либо объекта, больше не присутствуют в системе. Примером есть функция main и объект приложения app, которые в Java приложении отнесены к создаваемому классу приложения. В MFC приложении отсутствует функция main (WinMain спрятана в MFC каркасе) и объект приложения создается как глобальная переменная.

Полностью исключена препроцессорная обработка. Операция включения в программу файлов-заголовков с описаниями классов (include) заменена на операцию import, которая читает подготовленные бинарные файлы с описанием классов. Для поддержки пользовательских интерфейсов язык Java содержит библиотеки AWT и Swing, позволяющие создавать и поддерживать окна, использовать элементы управления (кнопки, меню, полосы прокрутки и др.), применять инструменты для создания графических приложений.

В Java отсутствуют указатели, хотя все переменные объектного типа являются ссылками. Создаются такие переменные динамически – через оператор New. При этом исчезла необходимость явно управлять памятью вызовами функции free или оператором delete, поскольку в систему встроен автоматический «сборщик мусора». Он освобождает память, на которую больше нет ссылок.

Оконное приложение с обработкой событий

Теперь создадим форму для подсчета ворон на заборе. Для этого будем отображать текущее количество ворон и с помощью двух кнопок добавлять или вычитать по одной.

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Вначале создадим метку (countLabel) а также две командные кнопки (addCrow и removeCrow) и разместим компоненты в окне:

Посмотрите, как выполнялась аналогичная задача в MFC приложении. Существенное отличие лишь в том, как созданные в окне компоненты удаляются. В MFC приложении они удаляются в деструкторе оператором delete. В Java приложении память, на которую больше нет ссылок, освобождается автоматически «сборщиком мусора».

Добавление событий

Пришло время добавить немного интерактивности. Нам нужно сделать 3 вещи:

Исходный код программы приводится ниже.

В MFC приложениях события идентифицировались именем константы в таблице-макросе, отнесенной к классу. Такое описание не имело ничего общего с ООП.

В Java для определения события используются три действующих лица – объект-источник события, объект-слушатель события и объект-событие.

Мы создаем сначала кнопку (объект-источник). При вызове метода addActionListener создается объект класса ActionListener (слушатель). При вызове обработчика события (метод actionPerformed) создается объект класса ActionEvent (событие), в котором объединены параметры события.

Объекты – источники событий должны быть объектами класса, который имеет методы для регистрации слушателя addXXXListener и отключения слушателя removeXXXListener. Здесь под XXX подразумевается некоторое имя события. Например, ActionListener или AWTEventListener, и т.д.

Один из подходов добавления событий состоит в том, чтобы создать для каждого компонента внутренний анонимный (без имени) класс непосредственно в методе addActionListener. Описание класса состоит только из определения метода actionPerformed. Синтаксис может показаться вам немного неуклюжим, но запомните его, в дальнейшем привыкните.

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

Для создания картинки необходимо в класс окна добавить панель – элемент класса, производный от класса Jpanel. Объектами на панели могут быть подгружаемые картинки, либо рисунки, выполненные инструментами Java 2D API.

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Исходный код программы приводится ниже.

Анимация изображения

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

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Исходный код программы приводится ниже. Файл рисунка «star.png» программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом javaразмещается в директории, где находятся файлы классов проекта.

В классе Board используется интерфейс ActionListener, реализованный в подключаемом библиотечном классе javax.swing.Timer. С помощью интерфейса к объекту класса Board (источнику события) подключается объект «таймер» (слушатель события). Функция actionPerformed (обработчик события) вызывается через каждые 25 мс. Промежуток времени устанавливается при создании объекта timer.

В этом приложении продемонстрировано подключение события непосредственно к классу, а не к объектам. Подключение событий к объектам было показано выше (см. Оконное приложение с обработкой событий).

Дополнительно к рассмотренной реализации класса Board ниже приводятся две альтернативные версии.

Board.java (2-я версия)

Board.java (3-я версия)

Анимация объектов с помощью потока (Thread) — самый точный способ анимации. Он реализуется через интерфейс Runnable. В предыдущих примерах мы выполнили задачу через определенные промежутки времени. В этом примере анимация будет проходить внутри потока.

Метод addNotify () вызывается после того, как панель была добавлена в JFrame компонент — add(new Board()). Этот метод часто используется для различных задач инициализации.

Метод run () вызывается только один раз — после создания объекта animator, при его запуске: animator.start(). Из этого метода в бесконечном цикле while вызываются методы cycle () и repaint (). Время выполнения этих методов может быть различным в каждом из while циклов. А мы хотим, чтобы анимация проходила на постоянной скорости. Поэтому вычисляем разницу timeDiff системного времени до и после запуска обоих методов. Эту разницу вычитаем из константы DELAY (50 мс), корректируя тем самым необходимую задержку (sleep) выполнения потока.

Ошибки, возникшие в программе во время её работы обрабатываются через исключения. Обработка исключений произведена в программе с помощью операторов try…catch.

Игровое приложение ”Snake”

Snake (Змея) – одна из старейших классических видеоигр. В этой игре голова змеи перемещается с помощью клавиш управления курсором, хвост следует за ней.

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Цель состоит в том, чтобы съесть столько яблок, как это возможно. Первоначально тело змеи состоит из 2-х суставов. Каждый раз, когда змея ест яблоко, ее тело растет. Змея должна избегать стен и своего собственного тела, поскольку в этом случае игра заканчивается.

Исходный код программы приводится ниже. Файлы рисунка «1.png» программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом javaи «2.png» программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом javaразмещается в директории, где находятся файлы классов проекта. Анимация реализуется через рассмотренный выше способ использования таймера (см. Анимация изображения).

Контрольные задания

Ознакомиться с программой “Snake” и последовательно модифицировать ее:

Сетевые приложения

Краткий обзор сетевых приложений

Ниже, на 3-х сетевых Java приложениях рассмотрено, как можно написать программы без знания всей глубины сетевых технологий (ресурсы операционной системы, маршрутизация между сетями, поиск адресов, физическая среда передачи и т.д.). Но все же вкратце рекомендуется ознакомиться с теоретическими основами разработки сетевых приложений на Java.

В приложениях используется клиент-серверная парадигма, которую примерно можно определить следующим образом:

Каждое из приложений демонстрирует решение определенной задачи:

– Приложение “A Date Server and Client” обеспечивает простую одностороннюю связь. Сервер отправляет данные только одному подключенному клиенту.

– Приложение “A capitalize server and client” демонстрирует двустороннюю связь сервера с множеством подключенных к нему клиентов.

– Игра для двух игроков “Крестики-нолики” показывает работу сервера, который должен следить за состоянием игры и информировать клиентов, чтобы каждый мог обновить свои данные в соответствии с изменениями у другого клиента. Т.е., сервер выступает в качестве посредника при общении 2-х клиентов между собой.

Приложение “Date Server and Client” с одним клиентом

Приложение состоит из 2-х программ, одна выполняется на стороне сервера, другая – на стороне клиента. При последовательном запуске программ в окне консоли появляется сообщение об активизации сервера и клиента.

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Перед очередным запуском программ не забывайте закрывать программы, которые остались открытыми ( running… ) от предыдущих запусков (см. нижнюю строку окна «Output»).

При запуске программы-клиента также появляется окно “Input”. После ввода в текстовое окно IP-адреса сервера (localhost) появляется окно “Message” с данными от сервера (текущая дата и время).

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Исходный код программы-сервера (файл DateServer.java):

Программа-сервер постоянно находится в состоянии ожидания, она прослушивает (listen) сеть, ожидая запросов от клиентов. Программа содержит класс DateServer с единственным методом main. Причем, этот метод объявляется так, что он может выбросить исключение (throws IOException).

В программе создаются сокеты. Сокет представляет собой программную конструкцию (объект), которая определяет конечную точку соединения. Вначале создается объект класса ServerSocket, затем — в бесконечном цикле ожидания while (true) объект класса Socket. Главное отличие ServerSocket от Socket, что объект первого класса (listener) заставляет программу ждать подключений. При подключении метод listener.accept() создает объект socket.

Затем создается объект out класса PrintWriter для вывода текста в поток. В параметрах конструктора указывается направление потока socket.getOutputStream() (выходной поток сокета) и задается автоматический сброс буфера (параметр autoFlush = true). Метод out.println (“текст”) обеспечивает запись текста в поток.

В бесконечном цикле while (true) можно передавать данные множеству подключаемых клиентов, если закомментировать break. Однако, при этом не предусмотрено закрытие объекта listener, оно возможно лишь через диспетчер задач (вызывается клавишами ctrl-alt-delete).

Исходный код программы-клиента (файл DateClient.java):

Вначале запускается dialog box с предложением ввести IP address сервера, затем клиент присоединяется к серверу (создается сокет s) и тот передает ему дату и время, которые отображаются в диалоговом окне.

Для получения данных от сервера открывается входной поток s.getInputStream(). А далее цепочка читателей: InputStreamReader читает байты из потока и преобразует их в символы; BufferedReader объединяет символы в строку. Строка отображается в диалоговом окне.

Приложение “Capitalization Server and Client” с несколькими клиентами

Это приложение, как и предыдущее, состоит из 2-х программ, одна выполняется на стороне сервера, другая – на стороне клиента. При последовательном запуске программ в окне консоли появляется сообщение об активизации сервера и клиента.

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Сервер позволяет подключаться нескольким клиентам.

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Когда один из клиентов посылает строку, содержащую точку «.», программа прекращает цикл и закрывается.

Исходный код программы-сервера и программы-клиента приводится ниже.

Программа-сервер (файл CapitalizeServer.java):

При соединении с клиентом объект socket передается на обслуживание создаваемого при этом побочного потока, а объект serversocket возвращается к прослушиванию других клиентов. При соединении с другим клиентом создается новый поток. Программа-сервер хранит номера клиентов, чтобы обрабатывать сообщения каждого потока.

В классе Capitalizer (производном от Thread) с интерфейсом Runnable определены все методы, необходимые для создания потоков. В рамках класса необходимо определить метод run. Он получает управление при запуске потока методом start.

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

Программа-клиент (файл CapitalizeClient.java):

Игра для двух игроков “Крестики-нолики”

Приложение «Tic Tac Toe game» (игра «Крестики-нолики») состоит из 2-х программ, одна выполняется на стороне сервера, другая – на стороне клиента. При последовательном запуске программ в окне консоли появляются сообщения об активизации сервера и клиента.

При запуске программы-клиента также появляется окно “Player X”, при повторном ее запуске – окно “ Player O”. Дальнейшее развитие и окончание игры видно из рисунка.

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Исходный код программы-сервера и программы-клиента приводится ниже. Рисунки программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом javaи программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом javaразмещается в директории, где находятся файлы классов проекта программы-клиента.

Программа-сервер (файл TicTacToeServer.java):

В функции main программы-сервера (файл TicTacToeServer.java) создается объект listener и запускается бесконечный цикл.

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

Далее в цикле объект listener прослушивает и подключает 2-х игроков-клиентов. Каждый из игроков (player) передается на обслуживание побочных потоков, а в конструкторе создаются сокет, потоки ввода-вывода и клиентам передаются приветствие и метка (mark) – X или O. Метка служит для идентификации клиента.

Далее потоки переходят в состояние “ Running” запуском (через start) метода run(), который определен в классе Player. В методе run() клиенту с меткой X передается сообщение начать игру («MESSAGE Your move»).

Затем организован собственный бесконечный цикл внутри потока. Здесь происходит обработка данных. От клиента (текущего игрока) поступает номер указанного мышкой квадратика, он сохраняется в переменной location. Методы класса Game по значению этой переменной и наполненности игровой доски определяют текущее состояние игры. Наполненность доски фиксируется в массиве board ссылками на игроков, которые заполнили соответствующие квадраты. Заполняется доска в методе legalMove. В соответствии с текущим состоянием игры передаются сообщения клиентам.

Метод legalMove определен с ключевым словом synchronized. Такой метод запрещает нескольким потокам одновременный доступ к нему. Прежде, чем начать выполнять его, поток пытается заблокировать объект, у которого вызывается метод. При завершении исполнения (как успешном, так и в случае ошибок) производится операция unlock, чтобы освободить объект для других потоков.

Метод legalMove вызывается в потоке игрока, который пытается сделать ход и проверяет, или ход является правильным. То есть, игрок выполняющий ход, должен быть текущим игроком и квадрат, в котором он пытается сделать ход, не должен быть уже занятым. Если ход правильный, состояние игры обновляется (квадрат заполнен, следующий игрок становится текущим, и он уведомляется о своем ходе).

Программа-клиент (файл TicTacToeClient.java):

В функции main программы-клиента запускается бесконечный цикл. В нем создается объект client класса TicTacToeClient. При этом конструктор устанавливает связь с сервером, создает сокет, потоки ввода-вывода, панель с массивом квадратных ячеек board[i]. Объекту каждой ячейки добавляется событие mousePressed, при котором через поток вывода серверу передается номер выбранной ячейки.

При вызове метода client.play() от сервера поступает сообщение о начале игры и метка (X или O), присвоенная игроку. Затем создается внутренний бесконечный цикл. Здесь происходит обработка сообщений сервера, полученных в ответ на выполненный ход (указание мышкой квадратика).

Контрольные задания

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

С программным кодом выполнения последнего задания можете ознакомиться по ссылке (Snake_net). Разработал приложение студент специальности «Компьютерные науки и информационные технологии» Лаврентий Антон.

Источник

Запускаем однофайловые программы в Java 11 без компилирования

программы с исходным кодом java. Смотреть фото программы с исходным кодом java. Смотреть картинку программы с исходным кодом java. Картинка про программы с исходным кодом java. Фото программы с исходным кодом java

Обычно для запуска этого класса требуется сначала скомпилировать его с помощью Java-компилятора (javac), который создаст файл HelloUniverse.class:

Затем нужно с помощью команды виртуальной машины Java (интерпретатора) запустить получившийся файл:

Тогда сначала запустится виртуалка, которая загрузит класс и исполнит код.

А если вам нужно быстро проверить фрагмент кода? Или вы новичок в Java (в данном случае это ключевой момент) и хотите поэкспериментировать с языком? Описанные два этапа могут всё усложнить.

В Java SE 11 можно напрямую запускать одиночные исходные файлы без промежуточной компиляции.

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

Профессионалы могут с помощью этих инструментов изучать нововведения в языке или тестировать незнакомые API. На наш взгляд, лучше автоматизировать многие задачи, вроде написания Java-программ в виде скриптов с последующим исполнением из оболочки ОС. В результате мы можем гибко работать с shell-скриптами и пользоваться всеми возможностями Java. Поговорим об этом подробнее во второй части статьи.

Эта прекрасная возможность Java 11 позволяет напрямую исполнять одиночный исходный файл без компилирования. Давайте обсудим.

Что вам потребуется

Для запуска кода, приведённого в статье, вам понадобится версия Java не ниже 11. На момент написания статьи текущим релизом был Java SE Development Kit 12.0.1 — финальная версия находится здесь, достаточно принять условия лицензии и кликнуть на ссылку для вашей ОС. Если хотите поэкспериментировать с самыми свежими возможностями, то можете скачать JDK 13 early access.

Обратите внимание, что сейчас также доступны релизы OpenJDK разных вендоров, в том числе AdoptOpenJDK.

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

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

Чтобы обойти это ограничение, все классы нужно определять в одном файле. Никаких ограничений на их количество нет. Кроме того, пока они находятся в одном файле, не имеет значения, являются ли они публичными или частными.

Первый класс, определённый в файле, будет считаться основным, и в него нужно поместить метод main. То есть важна очерёдность.

Первый пример

Начнём с классического простейшего примера — Hello Universe!

Мы продемонстрируем описываемую возможность на разных примерах, чтобы вы получили представление, как можно её использовать в повседневном программировании.

Создайте файл HelloUniverse.java с кодом из начала статьи, скомпилируйте и запустите получившийся class-файл. Затем удалите его, сейчас поймёте зачем:

Если теперь с помощью Java-интерпретатора вы запустите class-файл без компиляции:

то увидите тот же результат: файл будет исполнен.

То есть под капотом всё же выполняется компиляция. И в случае её ошибки мы получим уведомление об этом. Можете проверить структуру директорий и убедиться, что class-файл не генерируется, компиляция выполняется в памяти.

Теперь давайте разберёмся, как это всё устроено.

Как интерпретатор Java выполняет программу HelloUniverse

В JDK 10 модуль запуска Java может работать в трёх режимах:

Система определяет ваше намерение ввести исходный файл по двум признакам:

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

Это важно в случаях, когда исходный файл представляет из себя «скрипт», который нужно выполнить, а имя файла не соответствует обычным соглашениям о наименованиях исходных файлов с Java-кодом.

Можно ли передавать в командной строке аргументы?

Давайте расширим нашу программу Hello Universe, чтобы она выводила персональное приветствие любому пользователю, зашедшему на InfoQ Universe:

Сохраним код в файле Greater.java. Обратите внимание, что имя файла не соответствует имени публичного класса. Это нарушает правила спецификации Java.

Как видите, совершенно не важно, что имена класса и файла не совпадают. Внимательный читатель мог также заметить, что мы передали в код аргументы после обработки имени файла. Это означает, что любой аргумент в командной строке, идущий после имени файла, передаётся стандартному основному методу.

Давайте сначала рассмотрим второй сценарий. Переименуем Greater.java просто в greater без расширения и попробуем выполнить:

Всё просто. Теперь рассмотрим использование нескольких классов.

Работает ли этот подход с несколькими классами?

Рассмотрим пример с двумя классами. Код проверяет, является ли заданное строковое значение палиндромом.

Вот код, сохранённый в файле PalindromeChecker.java:

Запустим снова, подставив «RaceCar» вместо «MadAm»:

Теперь подставим «Mohamed» вместо «RaceCar»:

Как видите, можно добавлять в один исходный файл сколько угодно публичных классов. Следите только за тем, чтобы основной метод был определён первым. Интерпретатор будет использовать первый класс в качестве стартовой точки для запуска программы после компилирования кода в памяти.

Можно использовать модули?

То есть код может использовать разные модули без необходимости явно определять зависимости с помощью module-info.java.

Давайте рассмотрим код, делающий HTTP-вызов с помощью нового HTTP Client API, появившегося в JDK 11. Обратите внимание, что эти API были представлены в Java SE 9 в качестве экспериментальной возможности, но теперь они имеют статус полноценной функции модуля java.net.http.

В этом примере мы вызовем простой REST API с помощью метода GET, чтобы получить список пользователей. Обратимся к публичному сервису reqres.in/api/users?page=2. Код сохраним в файл с именем UsersHttpClient.java:

Запустим программу и получим результат:

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

Почему скрипты так важны в Java?

Сначала давайте вспомним, что такое скрипты:

Скрипт — это программа, написанная для определённого runtime-окружения, которая автоматизирует исполнение задач или команд, которые человек может исполнять поочерёдно.

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

Скриптовый язык использует серии команд, записанных в файле. Часто такие языки являются интерпретируемыми (а не компилируемыми) и придерживающимися процедурного стиля программирования (хотя некоторые скриптовые языки также обладают свойствами объектно-ориентированных языков).

В целом скриптовые языки легче в освоении и быстрее в наборе кода по сравнению с более структурированными компилируемыми языками вроде Java, C и С++. К серверным скриптовым языкам относятся Perl, PHP и Python, а на клиентской стороне — JavaScript.

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

Тем не менее, Java уже исполнилось 24 года, его использует около 10 млн разработчиков по всему миру. В последних релизах добавили ряд новых возможностей, чтобы молодым программистам было легче изучать этот язык, а также чтобы пользоваться функциями языка и API без компилирования и IDE. Например, в Java SE 9 появился инструмент JShell (REPL), который поддерживает интерактивное программирование.

В Java 11 есть два основных способа использования скриптов:

Shebang-файлы: запускаем Java как shell-скрипт

Итак, в Java SE 11 появилась поддержка скриптов, включая традиционные shebang-файлы из мира *nix. Для их поддержки не потребовалось спецификации языка.

В shebang-файле первые два байта должны быть 0x23 и 0x21. Это ASCII-кодировка символов #. Все последующие байты в файле читаются на основе действующей по умолчанию на данной платформе системы кодировки.

Таким образом, чтобы файл исполнился с помощью встроенного в ОС shebang-механизма, необходимо соблюсти лишь одно требование: чтобы первая строка начиналась с #. Это означает, что нам не нужна какая-то особенная первая строка, когда модуль запуска Java явно используется для запуска кода из исходного файла, как в случае с HelloUniverse.java.

Запустим следующий пример в терминале, работающем под macOS Mojave 10.14.5. Но сначала определим важные правила, которым нужно следовать при создании shebang-файла:

Запустим снова с помощью команды, которая передаёт родительскую директорию, и проверим результат.

Примечание: при оценке исходного кода интерпретатор игнорирует shebang-строку (первую строку). Таким образом, shebang-файл можно явно вызвать с помощью модуля запуска, например, с дополнительными опциями:

Также нужно отметить: если скриптовый файл лежит в текущей директории, то вы можете выполнить его так:

А если скрипт лежит в директории, путь которой указан в пользовательском PATH, то выполнить его можно так:

И в завершение дам несколько советов, о чём нужно помнить при использовании скриптов.

Советы

Обратите внимание на два файла java.java в пакете HelloUniverse и файл HelloUniverse.java в той же директории. Если вы попробуете выполнить:

то какой файл будет выполнен первым, а какой вторым? Модуль запуска больше не ссылается на class-файл в пакете HelloUniverse. Вместо этого он загрузит и выполнит исходный файл HelloUniverse.java, то есть будет запущен файл в текущей директории.

Shebang-файлы открывают массу возможностей по созданию скриптов для автоматизации всевозможных задач с использованием средств Java.

Резюме

Начиная с Java SE 11 и впервые в истории программирования вы можете напрямую исполнять скрипты с Java-кодом без компилирования. Это позволяет писать скрипты на Java и исполнять их из *nix-командной строки.

Поэкспериментируйте с этой функцией и поделитесь знанием с другими.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *