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

Базовый Java
≈ 4 мин чтения

Переменная — имя для значения

Программе постоянно нужно хранить данные: возраст пользователя, количество попыток, температуру, ответ «да» или «нет». Для этого в Java используются переменные. У каждой переменной есть имя и тип, а тип определяет, какие значения в ней можно хранить.

int age = 25;
double temperature = 21.5;
boolean online = true;
char grade = 'A';

В первой строке int — тип, age — имя переменной, а 25 — её начальное значение. После создания значение переменной можно поменять, но её тип останется тем же.

int score = 10;
score = 15;
Локальную переменную нужно заполнить до чтения. Java не позволит использовать локальную переменную, если компилятор не уверен, что к этому моменту ей уже присвоено значение.

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

Для простых значений в Java есть восемь примитивных типов. Их удобно запомнить по назначению:

  • byte, short, int, long — целые числа;
  • float, double — числа с дробной частью;
  • char — один 16-битный элемент UTF-16;
  • boolean — логическое значение true или false.

В обычном коде для целых чисел чаще всего используется int, а для дробных — double. Если нужен long или float, это можно явно показать суффиксом в значении.

int lessons = 12;
long views = 3_000_000_000L;
double progress = 72.5;
float ratio = 0.75F;
char firstLetter = 'J';
boolean completed = false;

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

Не все данные являются примитивами. Классы, интерфейсы и массивы относятся к ссылочным типам. Переменная такого типа хранит ссылку на объект либо специальное значение null, которое означает отсутствие ссылки.

String language = "Java";
String secondLanguage = null;

String здесь выглядит почти так же просто, как int, но это уже ссылочный тип. Как устроены строки, массивы и объекты, мы разберём в их собственных темах; сейчас важно различать две большие группы: примитивные и ссылочные типы.

Тип задаёт допустимые значения

Java проверяет типы ещё во время компиляции. Если переменная объявлена как число, в неё нельзя внезапно положить текст. Благодаря этому многие ошибки обнаруживаются ещё до запуска программы.

int count = 10;
count = 12;
// count = "twelve"; // compilation error

Некоторые числовые типы совместимы между собой. Значение более узкого типа может автоматически перейти в более широкий, если данные при этом не теряются. Обратное преобразование нужно указать явно.

int count = 10;
long total = count;

double price = 19.95;
int wholePrice = (int) price;

После последней строки wholePrice будет равен 19: при таком преобразовании дробная часть отбрасывается.

Явное преобразование не гарантирует сохранность данных. Если более широкий тип приводится к более узкому, часть информации может потеряться. Поэтому такое преобразование стоит делать только тогда, когда ты понимаешь возможный результат.

var — тип без повторения имени типа

Для локальных переменных Java позволяет написать var, если тип и так можно однозначно определить по начальному значению. Это не делает Java динамически типизированной: компилятор всё равно определяет конкретный тип один раз, и дальше он не меняется.

var users = 12;
var course = "Java";

// users = "twelve"; // compilation error

У var должно быть начальное значение, из которого компилятор сможет вывести тип. Использовать его стоит там, где тип и без повторения остаётся очевидным из кода.

Имена должны помогать читать код

Имя переменной лучше выбирать по смыслу данных, а не по их типу или позиции в программе. Для обычных переменных в Java принят стиль lowerCamelCase: первое слово начинается со строчной буквы, следующие — с заглавной.

int completedLessons = 7;
double averageScore = 91.5;
boolean premiumEnabled = true;

Теперь объявления вроде int completedLessons = 7; можно читать буквально: «создай переменную completedLessons типа int и положи в неё значение 7». Дальше операторы, условия и циклы будут работать именно с такими значениями и переменными.