head_image_begin

Все, что нужно
для старта в Java

Разберёмся в деталях, что потребуется для того, чтобы начать программировать на 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 файл. Установите программу и перезапустите компьютер.

На экране выбора компонентов не забудьте отметить для установки переменную окружения JAVA_HOME.

Для проверки установки нажмите 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 файле должен располагаться лишь один публичный класс с таким же как у файла именем и располагаться на самом верху. Остальные классы в файле, при их наличии, должны быть приватными.

3.1 Файлы с исходным кодом 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/DigitalMicrowave.java
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 также компилирует вашу программу для выполнения, однако, по умолчанию, помещает скомпилированные файлы в директорию временных файлов системы. При желании, это поведение можно изменить в параметрах программы.

Базовые понятия