Перейти к содержимому
Теория · Переменные и типы · урок 3 из 8

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

В прошлом уроке у каждой переменной был тип int. Но коробки в Java бывают разной формы и разного размера: для небольших целых чисел, для огромных, для дробных, для одного символа и для ответа «да или нет».

Представьте склад с коробками стандартных размеров. Маленькая коробка занимает меньше места, но большой предмет в неё не войдёт. С числами так же: тип определяет, сколько памяти занимает переменная и какие значения в неё помещаются. Вот программа, где у каждой переменной свой тип:

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

Четыре целых типа отличаются размером. Чем больше бит занимает переменная, тем больше чисел в неё помещается:

ТипРазмерДиапазон
byte8 битот -128 до 127
short16 битот -32768 до 32767
int32 битаоколо ±2,1 миллиарда
long64 битаоколо ±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 пишут с суффиксом:

JAVA
long big = 3_000_000_000L;
System.out.println(big); // 3000000000

Уберите L, и программа не скомпилируется. Три миллиарда не помещаются в int, а тип long слева этого не меняет:

TEXT
error: integer number too large

Здесь картинка со складом неточна. В настоящую коробку иногда удаётся втиснуть вещь чуть больше. Компилятор так не делает: значение, которое не помещается в коробку, он не пропустит, поэтому byte b = 200; тоже не скомпилируется.

String — не примитив

Текст в двойных кавычках, например "Anna", хранят в переменной типа String: String name = "Anna";. Это не девятый примитивный тип, а класс, поэтому его имя пишется с заглавной буквы.

Не путайте кавычки:

  • 'A' — это char, один символ;
  • "A" — это строка String, пусть и из одного символа.

Частая ошибка

Дробное число положили в float без суффикса:

JAVA
float ratio = 2.5; // ✗
TEXT
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.