
Разберёмся в деталях, что потребуется для того, чтобы начать программировать на Java.
К концу этого раздела у вас будут установлены инструменты разработчика JDK и интегрированная среда разработки, а также вы напишете свою первую программу!
11 октября 2021
ПО для разработки на Java
Для того, чтобы иметь возможность с комфортом разрабатывать Java программы, необходимо как минимум две вещи - комплект разработчика JDK и хороший редактор кода, как минимум, с подсветкой синтаксиса и автодополнением.
Java Development Kit
JDK - это набор программ, предназначенных для сборки и запуска программ на Java. В отличие от
программ на C/C++, где компилятор сразу собирает бинарый exe файл из исходного кода, Java программы
компилируются в промежуточный байт-код - файл с расширением .class
. Сделано
это для максимальной кроссплатформенности - разработчику не нужно каждый раз компилировать программу
под каждую платформу. Полученный файл передается виртуальной Java машине, компилируется в нативный
бинарый код системы и исполняется на лету.
Есть несколько реализаций JDK - проприетарная от Oracle и свободная от OpenJDK. Я рекомендую скачать версию OpenJDK 11 от Microsoft, отсюда. Найдите в списке вашу платформу (Windows x64) и скачайте msi файл. Установите программу и перезапустите компьютер.

Для проверки установки нажмите Win + X, выберите PowerShell и введите команду
java --version
. В качестве альтернативы вы можете запустить командную строку через меню
Пуск и ввести в ней ту же команду. Программа выведет свою версию, к примеру openjdk 11.0.12 2021-07-20.
Среда разработки
Интегрированная среда разработки - это, можно сказать, продвинутый редактор кода, который не только подсвечивает синтаксис, но и имеет инструменты автодополнения кода и его рефакторинга, а также поможет скомпилировать или отладить вашу программу. Рефакторинг позволяет быстро преобразовывать части программы, например, переименовывать переменные, вставлять недостающие импорты внешних пакетов и вычленять новые методы из вашего кода. Отладка программы или дебаггинг - это пошаговое выполнение вашей программы с возможностью отслеживания значений переменных - незаменимый инструмент при поиске недочетов (багов) в вашей программе.
На текущий момент есть три среды разработки для Java, достойных упоминания - это IntelliJ IDEA Community, Visual Studio Code и Eclipse IDE. Скачать их вы можете по приведённым ссылкам. Можете выбирать любую, которая вам понравится. Я же использую VS Code, и даже этот текст пишу именно в ней.
IntelliJ IDEA
Если вы скачали IntelliJ IDEA, то для начала работы создайте проект, введите его название и выберите
его новое местоположение на диске. Остальные настройки можете оставить по-умолчанию. После открытия
проекта щелкните ПКМ по папке src
в левой панели и выберите New > Java
Class. В появившемся окошке введите java_tasks.FirstProgram (имя пакета и файла
нашей программы) и нажмите Enter. Такая файловая структура Java программ общепринята и о
ней будет подробно рассказано в подглаве Файловая структура программы.
Теперь перед вами открыт ваш новый файл с некоторым кодом. Дополните его, как показано ниже, добавив
метод main
.
package java_tasks;
public class FirstProgram {
public static void main(String[] args) {
}
}
Для возможности выполнения нашей программы необходимо добавить новую конфигурацию сборки. Вызовите обозреватель конфигураций, нажав на кнопку Add Configuration... в правом верхнем углу программы. Добавьте новую конфигурацию, нажав на плюсик, и выберите в выпадающем списке пункт Application. Укажите имя конфигурации, например, JavaProgram, и главный класс, нажав на иконку справа в поле для ввода. В списке будет единственнственный элемент - ваш файлик. Дважды нажмите Ok и мы готовы начать.
Visual Studio Code
Если же вы выбрали VS Code, то создайте новую папку, в которй будет располагаться ваш проект, и
откройте её в программе (Файл > Открыть папку...). Альтернативный вариант - открыть нужную
папку в проводнике, нажать ПКМ и выбрать Открыть в Visual Studio Code. Щелкните
по пустой области проводника программы ПКМ и создайте новый файл. Дайте ему название
src/java_tasks/FirstProgram.java
. После нажания на Enter
программа создаст наш новый файл FirstProgram.java
в двух вложенных папках,
src
и java_tasks
соответственно. Такая файловая
структура Java проектов общепринята, и о ней подробнее рассказано в подглаве Файловая структура программы.
При первом открытии .java
файла программа
предложит скачать пакет расширений для работы с Java
, согласитесь и установите его.
Примечание
В программе доступен русский язык в виде расширения. Для его установки перейдите в панель расширений и введите в поиске Russian Language Pack for Visual Studio Code, после чего установите предложенный пакет.
Панель расширений можно найти в списке значков в левой части программы.
Eclipse IDE
Инструкции пока что нет, но вы держитесь.
Первая программа
Дополните ваш .java
файл следующими строками кода:
package java_tasks;
public class FirstProgram {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
Теперь вы можете запустить свою первую программу. Нажмите Shift + F10, если вы используете IntelliJ IDEA, либо F5, если у вас VS Code, и программа скомпилируется и запустится, а её вывод появится в консоли среды разработки. Поздравляю! Вы написали свою первую программу на Java.
С этого момента вы можете начать изучение раздела Базовые понятия и приступить к решению простых задач на Java. Если же вам хочется более подробно узнать об устройстве Java программ, то ниже изложены все детали.
Основа программы
Каждая Java программа начинается однотипно:
package java_tasks;
public class FirstProgram {
public static void main(String[] args) {
}
}
Мы объявляем публичный статический метод main
внутри публичного класса с именем нашего
файла, в данном случае MyProgram
. Все дальнейшие инструкции пишутся внутри этого
метода. Кроме того, мы указываем пакет нашей программы java_tasks
, имя которого
соответствует имени директории с нашим файлом.
Важно!
В одном .java
файле должен располагаться лишь один
публичный класс с таким
же как у
файла именем и располагаться на самом верху. Остальные классы в файле, при их наличии,
должны быть
приватными.
Главный метод
Наш метод main
является главным - именно с инструкций, расположенных в нем, наша
программа начинает работу. Из этого следует, что он должен быть в программе обязательно.
Рассмотрим его модификаторы.
public
- означает, что метод публичный, то есть его область
видимости распространяется на всю программу. Кроме public
также есть
модификаторы доступа protected
и private
, однако на текущий момент они
нам не понадобятся.
static
- означает, что метод статический. Обычные методы располагаются внутри
объектов, позволяя изменять их состояние, и для их вызова необходимо этот самый объект создать.
Чтобы метод был доступен без создания объекта, то есть, принадлежал к классу, к нему добавляют
данный модификатор.
void
- добавляется к методу, если он не возвращает никакого значения. В ином случае
вместо void
указывается возвращаемый тип, например, float
или
String
, а в самом теле метода, обычно, в его конце, размещается оператор
return
.
String[] args
- параметр метода main
. Состоит из названия
типа (String[]
- массив строк) и имени аргумента (args
).
Любой метод при необходимости может принимать в себя любое количество параметров, разделенных
запятыми, однако на практике рекомендуется использовать не больше двух или трёх.
Параметры метода необходимы для того, чтобы вызывающая сторона (в данном случае система) могла
передать в метод
какие-либо данные. Например, в случае метода main
, в параметр
args
из системы передается список аргументов командной строки, с
которыми программа была запущена.
main(..) { .. }
- Название метода и его тело. В круклых скобках прописываются параметры метода, а в фигурных - инструкции, которые метод исполнит при своём вызове. Телом метода называется как раз эта часть, включая фигурные скобки.
Кроме того, фигурные скобки задают область видимости переменных, объявленных внутри них - за их пределами к таким переменным обратиться не получится. Так что, если вам понадобятся переменные, к которым можно будет обращаться из нескольких методов, их необходимо объявлять в теле класса. Кроме того, чтобы иметь возможность обратиться к ним из наших статических методов, они также должны быть статическими.
Пример обращения к статической переменной:
package java_tasks;
public class SharedVariableExample {
private static int sharedVariable;
public static void main(String[] args) {
sharedVariable = 10;
addingFiveToVariable();
System.out.println(sharedVariable);
}
private static void addingFiveToVariable() {
sharedVariable += 5;
}
}
При запуске этой программы в консоль будет выведено число 15.
Подобные общие переменные называются полями класса, о них и о самом классе будет рассказано в следующей главе.
Главный класс
Java - язык объектно ориентированный, а значит, всё в нём есть объект. Под объектом подразумевается некая сущность, у которой есть своё уникальное поведение и состояние. И классы являются шаблонами, по которым эти сущности создаются.
Если приводить аналогию с реальным миром, то класс - это инструкция по сборке микроволновки, а объект - уже сама микроволновка. Соответственно, класс есть только один, а объектов, производных от него, сколько угодно.
В главе выше уже упоминались поля класса - переменные, принадлежащие одному объекту, и которые можно вызвать из любого его метода.
В нашем случае эти переменные были статическими - для обращения к ним нам не нужно создавать экземпляр класса (объект).
Статическим также является и метод main
, а значит, принадлежит к самому классу, также как и статические переменные.
Чтобы показать разницу между статическими полями и обычными, а также понять, как создаются экземпляры класса, взгляните на этот пример:
package java_tasks;
public class ObjectsExample {
public static void main(String[] args) {
ExampleClass object1 = new ExampleClass();
object1.GeneralField = 10;
ExampleClass object2 = new ExampleClass();
object2.GeneralField = 20;
ExampleClass.StaticField = 5;
System.out.println("GeneralField 1: " + object1.GeneralField);
System.out.println("GeneralField 2: " + object2.GeneralField);
System.out.println("StaticField: " + ExampleClass.StaticField);
}
}
class ExampleClass {
static int StaticField = 1;
int GeneralField;
}
Результатом выполнения данного кода будет вывод:
GeneralField 1: 10
GeneralField 2: 20
StaticField: 5
Мы создали новый класс - ExampleClass
, и задали ему два поля: статическое StaticField
и обычное GeneralField
. Затем, в вызове метода main
мы создали два разных экземпляра нашего класса, и у каждого присвоили своё значение полю GeneralField
. После чего, изменили значение статического поля StaticField
и вывели значения всех переменных в консоль.
ExampleClass object1 = new ExampleClass();
Создание нового объекта, или экземпляра класса, происходит практически также, как объявление обычной переменной: в левой части мы указываем тип значения (в нашем случае имя класса ExampleClass
) и его имя, а в правой создаем новый объект при помощи ключевого слова new
и имени класса с круглыми скобками, и присваиваем его нашей переменной посредством оператора =
.
Обратите внимание, что мы указывали имена созданных объектов для изменения обычных полей. А в случае статичского поля - явно указали название класса.
Файловая структура программы
Вы уже заметили, что наша программа находится в нескольких вложенных подпапках - src/java_tasks/FirstProgram.java
. А также, что наш код начинается с выражения package java_tasks
. Им мы объявляем пакет, в котором находится наш код. Кроме того, имя пакета должно соответствовать имени папки, в которой располагается файл с кодом.
Пакеты используются для того, чтобы разделить программу на небольшие составные части, каждая из которых выполняет свою определённую роль, а также создать понятную структуру, иерархию вашего проекта. В небольших проектах можно обойтись и единственным пакетом с одним или несколькими файлами исходного кода, однако в более крупных без них никак не обойтись.
Приведу пример. Вам нужно написать приложение, которое будет создавать несколько видов электротехники, например, микроволновки и электрочайники. Причем, у каждого вида электротехники есть несколько различных вариантов. Например, микроволновка с дисплеем или с механическим таймером, а электрочайник металлический или аллюминиевый. Кроме того, помимо электротехники, программа создает электромобили.
Вдаваться в детали реализации подобной программы в данный момент мы не будем. Всё что нам сейчас нужно - придумать, каким образом можно распределить пакеты и файлы исходного кода.
Пример файловой структуры подобной программы (без учета src/
):
creating_app/devices/microwaves/AnalogMicrowave.java
creating_app/devices/electric_kettles/MetallicKettle.java
creating_app/devices/electric_kettles/AluminiumKettle.java
creating_app/electro_cars/TeslaModel3.java
creating_app/electro_cars/TeslaRoadster2.java
creating_app/CreatingApp.java
Следуя файловой иерархии данной программы, будут созданы аналогичные пакеты:
creating_app
, в котором находится единственный файл с главным классом программы.
creating_app.electro_cars
, в котором находятся все классы электромобилей.
creating_app.devices.electric_kettles
, в котором содержатся электрочайники.
creating_app.devices.microwaves
- пакет с микроволновками.
Пакет creating_app.devices
не содержит в себе файлов с исходными кодами и служит ради более выраженной структуры файлов проекта.
Как уже можно заметить, пакеты могут быть вложенными друг в друга. И каждый файл .java
в своем начале будет содержать объявление пакета, к которому он принадлежит.
Теперь, мы можем создать наши электромобили и микроволновки обычным инстанциированием объекта, импортировав пакет с ними, либо указав пакет напрямую:
package creating_app;
import creating_app.devices.microwave.DigitalMicrowave;
import creating_app.devices.electric_kettles.*;
public class CreatingApp {
public static void main(String[] args) {
DigitalMicrowave microwave = new DigitalMicrowave();
MetallicKettle kettle = new MetallicKettle();
creating_app.electro_cars.TeslaModel3 car = new creating_app.electro_cars.TeslaModel3();
}
}
Как видно из примера выше, можно как импортировать один определённый класс, так и весь пакет целиком при помощи символа *
, однако, это рекомендуется делать, только если вам необходимо импортировать множество классов из одного пакета.
src/
и out/
Весь наш исходный код расположен не в главной директории проекта, а в поддиректории src/
- это стандартная практика для любой Java программы. Сделано это потому, что кроме исходников, в проекте могут находиться и другие файлы, такие как внешние ресурсы (например, изображения и звуки, которые наша программа будет использовать), файлы, которые ваша среда разработки создает при компиляции программы, файлы конфигурации и другие. Все эти данные располагаются в своих выделенных директориях: внешние ресурсы в resources/
, конфиги в configs/
, а файлы компиляции .class
в out/
.
Примечание
VS Code также компилирует вашу программу для выполнения, однако, по умолчанию, помещает скомпилированные файлы в директорию временных файлов системы. При желании, это поведение можно изменить в параметрах программы.