Примитивные типы
В прошлом уроке у каждой переменной был тип int. Но коробки в Java бывают разной формы и разного размера: для небольших целых чисел, для огромных, для дробных, для одного символа и для ответа «да или нет».
Представьте склад с коробками стандартных размеров. Маленькая коробка занимает меньше места, но большой предмет в неё не войдёт. С числами так же: тип определяет, сколько памяти занимает переменная и какие значения в неё помещаются. Вот программа, где у каждой переменной свой тип:
public class Main {
public static void main(String[] args) {
int age = 30;
long population = 8_100_000_000L;
double price = 19.99;
char grade = 'A';
boolean ready = true;
System.out.println(age); // 30
System.out.println(population); // 8100000000
System.out.println(price); // 19.99
System.out.println(grade); // A
System.out.println(ready); // true
}
}Пять переменных — пять разных форм коробки. Всего таких встроенных типов в Java восемь, и их называют примитивными типами: значение такой переменной лежит прямо в ней. Сколько в Java примитивных типов и какие они — частый вопрос на собеседовании. Разберём их по группам.
Восемь примитивных типов
Целые числа: byte, short, int, long
Четыре целых типа отличаются размером. Чем больше бит занимает переменная, тем больше чисел в неё помещается:
| Тип | Размер | Диапазон |
|---|---|---|
byte | 8 бит | от -128 до 127 |
short | 16 бит | от -32768 до 32767 |
int | 32 бита | около ±2,1 миллиарда |
long | 64 бита | около ±9,2 · 10¹⁸ |
Обычно целые числа хранят в int. Тип long берут, когда число может не поместиться в int: население Земли, время в миллисекундах, суммы в копейках. byte и short встречаются редко — там, где на счету каждый байт памяти.
Дробные числа: float и double
double хранит дробное число в 64 битах, примерно с 15–16 значащими цифрами. float занимает 32 бита и точен примерно до 7 цифр. Дробные числа в Java обычно хранят в double, а float берут, когда памяти мало.
Символ: char
char хранит один символ: букву, цифру или знак. Его значение пишут в одинарных кавычках: 'A', '7', '?'. Переменная типа char занимает 16 бит.
Логический тип: boolean
boolean хранит ответ «да или нет»: true или false. Других значений у него нет, и это не число: написать 0 вместо false или 1 вместо true нельзя.
Литералы
Значение, записанное прямо в коде, называется литералом. По виду литерала компилятор понимает его тип:
30—int: целое число без суффикса;8_100_000_000L—long: букваLв конце;19.99—double: дробное число без суффикса;2.5f—float: букваfв конце;'A'—char: один символ в одинарных кавычках;trueиfalse—boolean.
Знак _ внутри числа нужен только человеку: 1_000_000 читается лучше, чем 1000000, а компилятор подчёркиваний не замечает. Суффикс L пишут заглавным, потому что строчную l трудно отличить от единицы.
Важное правило: целый литерал без L всегда имеет тип int, даже если слева стоит long. Поэтому большое число для long пишут с суффиксом:
long big = 3_000_000_000L;
System.out.println(big); // 3000000000Уберите L, и программа не скомпилируется. Три миллиарда не помещаются в int, а тип long слева этого не меняет:
error: integer number too largeЗдесь картинка со складом неточна. В настоящую коробку иногда удаётся втиснуть вещь чуть больше. Компилятор так не делает: значение, которое не помещается в коробку, он не пропустит, поэтому byte b = 200; тоже не скомпилируется.
String — не примитив
Текст в двойных кавычках, например "Anna", хранят в переменной типа String: String name = "Anna";. Это не девятый примитивный тип, а класс, поэтому его имя пишется с заглавной буквы.
Не путайте кавычки:
'A'— этоchar, один символ;"A"— это строкаString, пусть и из одного символа.
Частая ошибка
Дробное число положили в float без суффикса:
float ratio = 2.5; // ✗error: incompatible types: possible lossy conversion from double to floatПрограмма не компилируется. Литерал 2.5 имеет тип double, а переход из double в меньший float может потерять точность, поэтому компилятор не делает его молча. Нужен литерал типа float: float ratio = 2.5f;.
Главное
- В Java восемь примитивных типов:
byte,short,int,long,float,double,char,boolean. - Целые числа обычно хранят в
int, дробные — вdouble;String— класс, а не примитивный тип. - Целый литерал без
L— этоint, поэтому большое число дляlongпишут с суффиксом:3_000_000_000L. - Литерал
2.5— этоdouble, и дляfloatнужен суффиксf:2.5f.