Всем привет! Эта статья немного запоздала у меня на сайте, так как вышли уже более сложные статьи, например, по фреймворку Spring, но не написать ее я не могу, тем более, что на моем канале уже давно лежит видео-версия данного материала.
Сегодня мы не просто создадим первое Java-приложение. Мы сделаем его без использования какой либо среды разработки (IDE), в текстовом редакторе. Итак, нам понадобится:
- текстовой редактор (я буду использовать Sublime Text 3);
- стандартная консоль операционной системы (в Линукс-системах — терминал, а в windows — cmd);
- заранее установленная jdk (у меня 1.8);
- пять минут Вашего времени.
Я буду использовать в своем уроке Linux (Mint), но все, что я покажу, можно проделать и на Windows, главное чтобы у вас были настроены все переменные среды, в частности правильно была прописана переменная JAVA_HOME.
Кстати, небольшое отступление. Если Вы планируете в будущем развиваться в Java, то, как показал мой даже не большой опыт, лучше сразу пересаживаться на Linux и изучать его. Почему? Потому, что по мере углубления в профессию, Вы обязательно столкнетесь с тем, что в Вашей очередной компании будет несколько разных серверов, в том числе удаленных, на которых будут стоять брокеры очередей, базы данных, какие-то другие сервисы, коннекторы, либо Вам нужно будет что-то починить в приложении, разворачивать которое локально — это какие-то запредельные танцы с бубном и проще его отладить удаленно. Безусловно для Windows есть Bitvise, но все равно все это проще делать через ssh, autossh и тому подобное. То есть по факту Linux на много больше подходит для разработки чем Windows или Mac и сильно облегчает Вам жизнь.
Ну, а мы возвращаемся к нашему приложению. Итак, открываем консоль, создаем папку для нашего будущего проекта, например HelloWorld, внутри нее создаем папку src — это стандартная папка исходных кодов в любом Java-проекте и переходим в эту папку:

Далее мы запускаем наш текстовой редактор. В моем случае, я просто, перейдя в нужный каталог, запускаю указанный выше Sublime Text 3 командой subl и начинаю писать код нашего первого приложения.
Подробно рассказывать о языке Java и его синтаксисе я сейчас не буду, это не задача данной статьи. Но если в кратце: Java — это объектно-ориентированный язык программирования (есть, например, еще функциональные). Основа данного типа языков — объекты. Все в этом мире есть объекты. Например: летающий аппарат (ЛА). ЛА можно в первом приближении поделить на разные типы. Например: свободно парящие и приводимые в движение внешней силой. Вторые можно поделить на: самолеты, ракеты, различного вида аэростаты, воздушные шары. Самолеты можно поделить на реактивные, винтовые, турбовинтовые. Ну и так далее.
У каждого ЛА есть свойства, определяющие, конфигурирующие его: вес, размер, скорость, название модели. Эти свойства представлены как обычными числовыми примитивами (например, размер, скорость — это int (целое число), вес — double (дробное число), а название модели — String (строка)), так и семейством других объектов, например — материал. То есть, у нас может быть отдельное дерево материалов, и какой-то из них может быть свойством ЛА. Другими словами, объекты в качестве свойств могут содержать другие объекты. Так же у объектов есть методы. Это как бы действия, глаголы. Например, метод «лететь». Методы могут принимать входные параметры:
лететь(int координатаА, int координатаБ)
Если метод ничего не возвращает, никакого результата своего выполнения, то перед его названием ставится ключевое слово void:
void fly(int a, int b)
Но метод может и возвращать что-либо, например, результат своего выполнения. В нашем случае — долетел, не долетел. Есть в Java булева переменная boolean, которая способна содержать только 2 значения ЛОЖЬ / ИСТИНА, то есть TRUE / FALSE. И тогда наш метод будет выглядеть так:
boolean fly(int a, int b) {
// реализация метода
}
И вызов метода:
boolean result = fly(100, 200);
Ну а теперь переходим к написаню кода нашей программы, и по ходу я дополню вышеизложенный рассказ комментариями уже по «боевому коду».
Итак, мы уже открыли текстовой редактор и в созданном новом документе вводим:
Несколько комментарий по коду:
class Main — это класс нашего приложения. Что такое класс? Класс — это как бы чертеж объекта, его описание. Про объекты — смотрите выше. Несколько правил: в Java принято, что на 1 файл 1 класс. То есть, написать вот так в одном файле:
public Main1 {
// some code
}
public Main2 {
// some code
}
… нельзя. Так же нельзя в коде создать класс:
public Main {
// some code
}
, а файл сохранить как XYZ.java. То есть имя файла должно совпадать с именем класса. Но при этом в Яве есть вложенные классы и вот у одного внешнего класса может быть несколько вложенных, однако об этом позже.
Что такое public…? Это модификатор доступа. Очень-очень коротко про это: модификатор доступа это область видимости класса, метода, переменной.
Если мы говорим о классе, то он может быть только public или default. Класс объявленный без модификатора доступа является default и доступен только из других классов в одном пакете, класс имеющий модификатор public — доступен отовсюду. Про пакеты — это отдельная история, если объяснять на совсем «деревенском», то пакеты — это что-то типа аналога деления на папки, директории в операционной системе. Но, повторюсь — это очень обобщенное и не совсем верное объяснение.
Идем, дальше. Что такое public static void main(String[] args) {} ? Разбираем:
- public — как было замечено выше, модификатор доступа. Только для методов они еще могут быть, например, private (то есть доступны только внутри класса) или protected (то есть доступны внутри класса и его наследников).
- static — модификатор static для переменной или метода работает следующим образом. Обычная переменная или метод создаются отдельно для каждого экземпляра класса. Напомню, ключевое слово class — это только чертеж, описание класса. Чтобы «чертеж» использовать, по нему надо сделать «деталь». В Яве это называется разными терминами, например, «инициализировать» или сделать инстанс класса, экземпляр класса. В коде это может выглядеть так (например, мы хотим из какого-то другого класса обратится к классу Main):
Main main = new Main();
main — это переменная типа Main. new — зарезервированное ключевое слово, принуждающее компилятор создать инстанс того или иного класса. То есть, опять же, если совсем на пальцах. Представим что у нас есть чертеж самолета, который называется ЧертежСамолета, мы говорим компилятору:
ЧертежСамолета самолет = новый ЧертежСамолета();
… то есть:
Компилятор, создай мне самолет по ЧертежуСамолета, чтобы это был самолет того типа, который указан в ЧертежСамолет.
Так, собственно, о чем мы? Мы же о static, а не о самолетах. Таким образом, если мы захотим создать второй самолет, это будет:
ЧертежСамолет самолет2 = новый ЧертежСамолет ();
Представим себе, что у самолета есть свойство вес — weight. И давайте уже вернемся на английский. И если мы вернемся к вышеуказанному коду, то:
PlaneBluePrint plane1 = new PlaneBluePrint();
PlaneBluePrint plane2 = new PlaneBluePrint();
… и если мы обратимся к переменной, обычной не-static переменной, то:
plane1.weight = 12;
plane2.weight = 6;
… это будут две разные переменные. plane1 и plane2 — два соверешнно разных инстанса (экземпляра) класса.
И если бы у класса был static метод setWeight, который бы устанавливал статическую переменную weight, а так же была бы НЕ-STATIC переменная name, которая бы устанавливалась сеттером (методом) setName(String name), который так же печатал бы в консоль содержание name и weight, то вызвав сначала
PlaneBluePrint.setWeight(10);
а потом
plane1.name = «A»;
plane2.name = «B»;
Мы получили бы в консоли:
weight = 10
name = A
weight = 10
name = B
И обратите внимание, что метод setName мы вызываем для объектной переменной экземпляра класса plane1 (или plane2), а метод setWeight мы вызываем у самого класса. Таким образом, если коротко — статические переменные и статические методы принадлежат классу, а не его экземпляру и едины для всех его инстансов. - Идем дальше. Далее у нас идет void — про него мы уже говорили. Это ключевое слово, обозначающее, что метод ничего не возвращает, никакого результата.
- main — очень важно запомнить, что метод main — это метод по которому java-компилятор определяет как бы «главный», «исполняемый» класс нашего приложения. Метод main — это точка входа в вашу программу.
- String[] args — это массив параметров для нашего метода. Пока просто примите как данность, забивать Вам голову еще и этим я точно не буду, тем более что в 90% случаев вы ближайшие лет пять просто будете копировать данную запись и все.
Внутри скобок {…} идет реализация метода, его «тело». Мы используем там следуюущю запись:
System.out.println("");
Данная «команда» выводит в консоль с переводом строки то, что пользователь передал в скобках «…». В нашем случае это HelloWorld.
Пришло время скомилировать и запустить нашу программу, а то и так слишком много букв уже в этой статье.
Сохраняем наш только что написанный класс в ранее созданной папке src под именем, соответствующим названию класса. В нашем случае — Main.java.
Теперь переходим в консоль / терминал. Поднимаемся на один уровень выше каталога src. То есть если у вас каталог src лежит в папке HelloWorld, вы должны находится в папке HelloWorld.
И компилируем приложение следующей командой прямо из консоли:
После выполнения команды смотрим, что у нас появилось нового в структуре нашего проекта:

Как видно, у нас появился каталог bin и там файл Main.class. Это уже скомпилированный файл.
Снова нужно удостоверится, что мы в каталоге HelloWorld и ввести следующую команду:
И в консоли Вы увидите результат выполнения нашего первого приложения:

… то есть строчку Hello World!
Обратите внимание, что в Вашем конкретном случае, особенно, если у вас Windows-машина путь «-classpath ./bin» можеть быть другим или писаться по другому.
Вот собственно и все. Поздравляю с Вашим первым Java-приложением!
Ну и в конце более короткая видео-версия данной статьи: