Skip to content
Содержание

Введение в Java

Java - это строго типизированный, объектно-ориентированный язык программирования общего назначения. Разработан Джеймсом Гослингом в Sun Microsystems и выпущен в 1995 году. Сегодня поддерживается Oracle и сообществом OpenJDK. Изначально язык назывался Oak, в честь дуба, который рос за окном Гослинга. Но оказалось, что название занято, поэтому язык был переименован в Java - в честь сорта кофе, который пили разработчики. Логотипом стала чашка с дымящимся кофе.

Почему Java

  • Кроссплатформенность - принцип «Write Once, Run Anywhere». Скомпилированный байт-код выполняется на любой ОС через JVM
  • Строгая типизация - ошибки типов ловятся на этапе компиляции, а не в рантайме
  • Управление памятью - сборщик мусора избавляет от ручного освобождения памяти
  • Многопоточность - встроенная поддержка конкурентности на уровне языка
  • Экосистема - Spring, Jakarta EE, Android, Big Data, микросервисы

Экосистема: три ключевых компонента

JVM (Java Virtual Machine) — Виртуальная машина Java

Что это: Абстрактная вычислительная машина, которая выполняет Java-байткод.

Ключевые моменты:

  • Интерпретирует или компилирует байткод в машинный код конкретной платформы
  • Обеспечивает принцип "Write Once, Run Anywhere" (написал один раз — запускай везде)
  • Управляет памятью (garbage collection), безопасностью и многопоточностью
  • Зависит от операционной системы (разные JVM для Windows, Linux, macOS)

Сердце Java. Именно JVM позволила джаве стать одним из самых распространенных языков программирования. Неважно на чём вы запускаете код. Если для этой платформы есть реализация JVM - код запустится. Хоть на холодильнике.


JRE (Java Runtime Environment) — Среда выполнения Java

Что это: Набор программных компонентов для запуска Java-приложений.

Состав:

  • JVM + стандартные библиотеки Java (java.lang, java.util и др.)
  • Вспомогательные файлы и ресурсы

Предназначена для пользователей, которым нужно только запускать Java-приложения. Хотите запустить майнкрафт? Вам нужна JRE.


JDK (Java Development Kit) — Набор разработчика Java

Что это: Полноценный инструментарий для разработки Java-приложений.

Состав:

  • JRE (всё, что есть в JRE)
  • Компилятор javac
  • Отладчик jdb
  • Документатор javadoc
  • Архиватор jar
  • Другие инструменты разработки

Хотите написать майнкрафт 2? Вам нужна JDK.


Кратенькая таблица:

КомпонентНазначениеНужно для
JVM (Java Virtual Machine)Исполняет байт-код, абстрагирует от ОСВсего
JRE (Java Runtime Environment)JVM + стандартные библиотекиЗапуска программ
JDK (Java Development Kit)JRE + компилятор (javac), отладчик, утилитыРазработки программ

Что из этого нужно-то?

Если вдруг кто-то не понял - для разработки используется JDK!

Как работает компиляция (в двух словах)

Java - двухэтапный язык:

  1. Компиляция: javac переводит исходный код в байт-код (.class файлы). Байт-код платформонезависим
  2. Выполнение: java запускает JVM, которая интерпретирует или JIT-компилирует байт-код в нативный код конкретной платформы

Исходник (.java) -> javac (компилятор) -> Байт-код (.class) -> java -> JVM -> Машинный код

Первая программа

Hello World

Создайте файл HelloWorld.java и откройте его в любом текстовом редакторе (можно блокнот). Вставьте туда следующий код:

java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

Важно!

Название файла и имя класса (public class *имя класса* в первой строке) должны точно совпадать! Если файл назван HelloWorld.java, а класс WorldHello (public class WorldHello), то при компиляции возникнет ошибка.

Разберём что здесь написано:

СтрокаЧто означает
public class HelloWorldМы создаём класс с именем HelloWorld. Пока просто запомнить, что это обязательная обёртка. О том, что такое класс, поговорим позже
{ и }Фигурные скобки группируют команды (блоки кода). Открывающая скобка - начало блока, закрывающая - конец.
public static void main(String[] args)Это "точка входа" - место, с которого программа начинает работу. Любая программа на Java должна её содержать. То же, что и с public class... - пока просто запомнить.
System.out.println("Hello, World!");Эта команда печатает текст на экране (в консоли). Будет выведено всё внутри кавычек. ; - конец команды.

Компиляция и запуск

Сначала код необходимо скомпилировать, используя javac. После этого рядом с HelloWorld.java появится HelloWorld.class. Теперь с помощью java его можно запустить. Пример:

bash
javac HelloWorld.java # компиляция в байт-код
java HelloWorld # запуск

Запуск после компиляции

Обратите внимание на вторую команду. В ней мы указываем не название файла (не HelloWorld.java и не HelloWorld.class), а название класса! То есть HelloWorld!

Переменные и типы данных

Переменная - это контейнер для данных, в который можно положить какое-то значение. У контейнера есть тип - что можно в неё класть. Все типы данных в Java делятся на примитивные и ссылочные.

Основные типы данных

На первых занятиях вам понадобятся только intdouble и String. Остальные типы изучим позже - пока просто знайте, что они существуют.

Примитивные типы

ТипЧто хранитРазмерПример
byteЦелые числа от -128 до 1271 байт25, -10, 0
shortЦелые числа от -32768 до 327672 байта1827
intЦелые числа от -2,147,483,648 (-2³¹) до 2,147,483,647 (2³¹ - 1)4 байта1234567
longЦелые числа от -2⁶³ до 2⁶³ - 18 байтНе поместилось
floatВещественные числа (дробные) от -3.4 × 10³⁸ до 3.4 × 10³⁸4 байта1.75f, 3.14f, -0.5f
doubleВещественные числа от -1.7 × 10³⁰⁸ до 1.7 × 10³⁰⁸8 байт1.75, 3.14, -0.5
charСимвольный тип данных (хранит один символ)2 байта'a', 'b', 'c'
boolЗначение true\false1 байтtrue/false

Как уже было сказано, в ближайшее время вас интересуют только int (для целых чисел) и double (для дробных чисел).

Ссылочные типы

Пока что нам нужно знать только про один тип:

ТипЧто хранитРазмерПример
StringТекст (в двоичных кавычках)Варьируется"Hello", "World", "Привет"
String - это ссылочный тип. В отличие от примитивов, он хранит не само значение, а ссылку на объект в памяти. Но пока вам достаточно знать, что String используется для текста.

Правила именования переменных

  1. Имя не должно начинаться с цифры.
  2. Имя не должно содержать специальных символов, пробелов и кириллицы.
  3. Имя должно начинаться с маленькой буквы.
  4. Имя должно отражать суть того, что хранится в переменной (опционально, но желательно).
  5. Если название состоит из нескольких слов, то используют camelCase (первое слово с маленькой буквы, последующие с большой без пробела. Например: firstName, buildStock)

Объявление переменной

Для того, чтобы объявить переменную, нужно указать тип данных, который будет в ней храниться, название переменной и (опционально) сразу указать значение:

java
int age = 20;
double height = 1.75;
String name = "Иван";

int x; // необязательно указывать значение сразу
double y;

x = 15;
y = 3.14;

Вывод переменных

Как уже говорилось выше, за вывод текста в консоль отвечает команда System.out.println:

java
System.out.println("Hello, World!")

Текст и переменные можно объединять знаком + (конкатенация):

java
System.out.println("Меня зовут " + name + ", мне" + age + " лет");

Вывод: Меня зовут Иван, мне 20 лет

Ввод данных с клавиатуры (Scanner)

Для того, чтобы получить данные от пользователя (программа спрашивает, а пользователь вводит ответ), используется специальный класс Scanner

Шаблон:

java
import java.util.Scanner;  // 1. Подключаем Scanner (пишем ДО public class)

public class InputExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);  // 2. Создаём сканнер

        System.out.print("Введите ваше имя: ");
        String name = scanner.nextLine();          // 3. Читаем строку (текст)

        System.out.print("Введите ваш возраст: ");
        int age = scanner.nextInt();               // 4. Читаем целое число

        System.out.println("Привет, " + name + "! Через год вам будет " + (age + 1));

        scanner.close();  // 5. Закрываем сканнер (хороший тон, но не обязательно)
    }
}

Что здесь происходит

СтрокаЧто делает
import java.util.Scanner;Говорим Java: "нам понадобится Scanner". Пишется в самом начале файла.
Scanner scanner = new Scanner(System.in);Создаём сам сканнер. Назвали его scanner (можно назвать scan или s или qwertyu).
scanner.nextLine();Ждёт, пока пользователь введёт текст и нажмёт Enter. Возвращает строку (String).
scanner.nextInt();Ждёт, пока пользователь введёт число и нажмёт Enter. Возвращает целое число (int).
scanner.close();Закрываем сканнер (освобождаем ресурсы). Необязательно, но считается хорошим тоном.

Арифметические операции

С переменными можно делать вычисления с помощью арифметических операторов: + (сложение), - (вычитание), * (умножение), / (деление), % (остаток от деления)

Пример:

java
int a = 10;
int b = 3;
int sum = a + b; // 13
int diff = a - b; // 7
int product = a * b; // 30
int quotient = a / b; // 3
int remainder = a % b; // 1

Осторожно с делением!

Обратите внимание на строку с переменной quotient, операцию деления. В результате мы получаем 3, а не 3.333... Это связано с тем, что и делимое, и делитель, и частное объявлены типом int, т.е. целое число. Поэтому в результате дробная часть отбрасывается.

Для того, чтобы получить верный дробный результат, нужно сделать дробными частное и делимое/делитель (либо одно из чисел, либо оба). Например:

java
// Неправильный вариант, все переменные - целые числа
int a = 5;  
int b = 2;  
int c = a / b; // 2

// Неправильный вариант
double a = 5;
double b = 2;
int c = a / b; // ошибка. Результат имеет тип double, а переменная - int

// Правильный вариант, делимое является дробным числом
double a = 5;  
int b = 2;  
double c = a / b; // 2.5

// Правильный вариант, делитель является дробным числом
int a = 5;  
double b = 2;  
double c = a / b; // 2.5

// Правильный вариант, и делимое, и делитель - дробные числа
double a = 5;  
double b = 2;  
double c = a / b; // 2.5

Операторы присваивания с операцией

Если нам нужно, например, увеличить переменную на 5, то мы можем использовать самую очевидную запись i = i + 5. Но специально для таких целей в Java есть операторы присваивания с операцией. При их использовании, прошлый пример будет выглядеть так: i += 5. Обе записи абсолютно эквивалентны. Таблица с основными такими операторами:

ОператорЭквивалент
+=a += ba = a + b
-=a -= ba = a - b
*=a *= ba = a * b
/=a /= ba = a / b
%=a %= ba = a % b

Практическая работа №1

0.5. Установка и проверка JDK (если работаете на своём ноуте!)

  • Установите JDK. Инструкция описана в лекции 0.5 (тут)
  • Проверьте установку. Это также описано в лекции 0.5

1. Первая (вторая?) программа

Напишите программу, которая объявляет переменные с вашим именем и возрастом, а затем выводит фразу:

«Привет! Меня зовут ... и мне ... лет».

2. Ввод через Scanner

Напишите программу, которая:

  1. Спрашивает у пользователя его любимый город.
  2. Спрашивает возраст.
  3. Выводит сообщение: «Вы живёте в ... и вам ... лет».

Подсказка: для города используйте scanner.nextLine(), для возраста – scanner.nextInt().

3. Арифметические операции

Объявите две переменные типа int с любыми числами. Выведите их сумму, разность и произведение.

4*. Операции и Scanner

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

P.S.

В этой лекции было использовано очень много страшных слов. JIT, байт-код, компиляция, интерпретация (если я не забыл вставить сравнение с питоном), всякие public static class void. Не переживайте, если что-то не поняли. Всё это либо будет проходиться позже, либо не будет вообще. Во втором случае просто забудьте про существование этих слов.