Начнем с установки Java и знакомства с REPL. Если на вашем компьютере пока не стоит Java, то выполните установку по нашей инструкции.
Если установка прошла без ошибок, то самое время убедиться в том, что Java работает. Заметьте, что "установилось" и "работает" — не одно и тоже. Наберите в терминале java --version
. Вывод должен быть примерно такой:
# Вывод может отличаться, главное чтобы не было ошибок
java --version
openjdk 20 23-03-21
OpenJDK Runtime Environment Homebrew (build 20)
OpenJDK 64-Bit Server VM Homebrew (build 20, mixed mode, sharing)
REPL
Если все прошло удачно, то теперь самое время начать выполнять код на Java. Java поставляется со встроенным REPL (Read Eval Print Loop). REPL – это программа, которая работает как командная оболочка. Она ожидает ввод от пользователя (Read), выполняет введенный код (Eval) и печатает на экран результат (Print), затем снова входит в режим ожидания (Loop). Для его запуска достаточно набрать jshell
:
jshell
| Welcome to JShell -- Version 20
| For an introduction type: /help intro
jshell>
Теперь можно выполнять код на Java и сразу же смотреть результат его выполнения. Наберите любой корректный код на Java и нажмите Enter:
jshell> 10 + 5
$1 ==> 15
jshell>
REPL выводит результат выполнения операции прямо на экран и снова входит в режим ожидания ввода команд. Для выхода из репла достаточно нажать Ctrl + d. Такой способ работы очень хорошо подходит для быстрой проверки гипотез "а как работает эта штука?", а также для отладки и простых вычислений. REPL позволяет использовать переменные и запоминает предыдущий ввод:
jshell> var a = 5
a ==> 5
jshell> var b = 3
b ==> 3
jshell> a + b
$4 ==> 8
jshell>
Для успешного обучения крайне важно, чтобы весь код, который мы демонстрируем в дальнейшем, вы набирали и запускали локально. Только тогда будет приходить настоящее понимание того, что происходит. В тех случаях, когда репла недостаточно, код можно и нужно запускать в виде файлов.
Файлы
Создайте файл HelloWorld.java внутри git-репозитория hexlet-java из прошлого урока. Добавьте туда следующий код:
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Hexlet!");
}
}
https://replit.com/@hexlet/java-setup-environment-hello-world
Теперь осталось запустить его на выполнение:
# Обязательно указать расширение
java HelloWorld.java
Hello, Hexlet!
Если все было сделано правильно, то на экране появится строка Hello, Hexlet!, а программа успешно завершится. На этом этапе появляются первые соглашения и правила, о которых нужно знать:
- Файлы Java имеют расширение java
- Каждый Java файл содержит ровно один Java класс. Практически все файлы в Java это файлы с классами (еще есть интерфейсы, но мы их рассмотрим позже)
- Имя класса совпадает с именем файла без расширения
Класс HelloWorld
, в нашем случае, не обычный Java класс, это точка входа в программу. Именно с нее начинается выполнение. Откуда Java знает как запустить этот класс? Это благодаря методу main
. Его необходимо реализовать ровно в таком виде, в котором мы его видим выше:
// args – сюда попадают аргументы командной строки
// если они есть
public static void main(String[] args) {
}
Метод main()
нужен только у входной точки, в остальных классах его не добавляют, так как эти классы не запускаются отдельно.
Компиляция и запуск
Команда java выглядит очень простой. На вход ей подается файл с исходным кодом, на выходе – результат выполнения. Под капотом происходит два действия: компиляция и запуск. Их можно выполнить отдельно и тогда станет виден весь процесс.
Java — компилируемый язык программирования. Файл с исходным кодом компилируемого языка нельзя взять и просто так запустить, сначала его нужно превратить в понятный для машины код. За это отвечает компилятор javac. Вызывается он так:
javac HelloWorld.java
# ничего не выводит
javac
не запускает программу, он выполняет компиляцию, во время которой проверяется корректность программы (соответствие типов) и формируется файл HelloWorld.class с байткодом.
Почему байткод, а не машинный код? Дело в том, что Java программы запускаются через виртуальную машину JVM, поэтому компиляция создает не машинный код, а байткод, это машинный код для виртуальной машины JVM. Пока звучит сложно, поэтому рассмотрим этот вопрос в одном из следующих уроков, после того как немного поработаем с инфраструктурой
После того как компиляция прошла, программа готова к запуску. Запуск выполняется командой java:
# Расширение не указывается
java HelloWorld
Такой запуск ищет файл с именем HelloWorld.class в рабочей директории и запускает его. Файл HelloWorld.java уже не используется, его можно даже удалить. И изменения в этом файле не будут использованы до тех пор, пока не выполнится повторная компиляция.
Возникает вопрос, а зачем вызывать компилятор отдельно если команда java умеет делать это автоматически? На это есть множество причин и одна из них это то, что программы на Java состоят больше чем из одного файла. Об этом мы поговорим в следующим уроке.
Самостоятельная работа
- Установите Java
- Запустите репл и попробуйте выполнить внутри Java-код
- Вычислите в репле значение выражения
832 + 299
В проекте hexlet-java создайте файл HelloWorld.java и добавьте туда:
class HelloWorld { public static void main(String[] args) { System.out.println("Hello, Hexlet!"); } }
Запустите этот файл командой java HelloWorld.java, убедитесь что на экран вывелась строчка Hello, Hexlet!
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.