JavaRush /Java блог /Java Developer /Литералы в Java
Автор
Pavlo Plynko
Java-разработчик в CodeGym

Литералы в Java

Статья из группы Java Developer
На этапе создания приложения разработчик, как правило, знает только его структуру и не предполагает, какие данные оно будет обрабатывать. Тем не менее, в некоторых ситуациях в коде программы нужно явно указывать какие-то данные (например, количество итераций или сообщение для вывода). В этом случае на помощь приходят литералы. Содержание:

Что такое литералы?

Литералы — это явно заданные значения в коде программы — константы определенного типа, которые находятся в коде в момент запуска.

class Test {
   public static void main(String[] args) {
       System.out.println("Hello world!");
   }
}
В этом классе “Hello world!” — литерал. Литералы бывают разных типов, которые определяются их назначением и способом написания.

Типы литералов и их применение

Все литералы — это примитивные значения (строки, числа, символы, булевы значения). Нельзя создать литерал-объект. Единственный литерал, связанный с объектом — это null. В соответствии с примитивами, литералы также делятся на разделы:
  1. Числовые:
    • Целочисленные;
    • С плавающей точкой;
  2. Строковые;
  3. Символьные;
  4. Логические.

Числовые литералы

Целочисленные литералы

Данный вид литералов — самый простой. Числа записываются в их стандартном виде без указывающих символов и прочего. Любое целое число — по умолчанию целочисленный литерал. То есть можно явно задать значение переменной или количество итераций в цикле. В Java поддерживается 4 системы счисления:
  • Двоичная
  • Восьмеричная
  • Десятичная
  • Шестнадцатеричная
В JDK 7 появилась возможность записи двоичных значений. Делается это с помощью префикса 0b или 0B. Далее идет запись с использованием 0 и 1. Числа в восьмеричной системе записываются с помощью ведущего 0. Допустимые цифры — от 0 до 7. Запись 09 или 08 вызовет ошибку компиляции. С десятичной системой счисления нет никаких проблем: числа указываются в привычном нам виде. Единственное ограничение — число не может начинаться с 0, так как компилятор примет его за восьмеричное. Числа в шестнадцатеричной системе записываются с помощью префиксов 0x и 0X. Допустимые цифры — от 0 до 15, где числа 10-15 обозначаются символами A-F соответственно.

public static void main(String[] args) {
       int a = 0b1101010110;
       int b = 012314;
       int c = 456;
       int d = 0x141D12;
       System.out.println("Число a в двоичной системе: " + a);
       System.out.println("Число b в восьмеричной системе: " + b);
       System.out.println("Число c в десятичной системе: " + c);
       System.out.println("Число d в шестнадцатеричной системе: " + d);
}
Вывод: Число a в двоичной системе: 854 Число b в восьмеричной системе: 5324 Число c в десятичной системе: 456 Число d в шестнадцатеричной системе: 1318162 Несмотря на то, что числа задаются в разных системах счисления, в программе они обрабатываются как десятичные числа. Выход за пределы значений приведет к ошибке компиляции:

       int b = 012914; // Ошибка
       int d = 0x141Z12; // Ошибка
При запуске на этапе компиляции получим следующий результат:

Error:(13, 25) java: integer number too large: 012914
Error:(14,30) java: ';' expected
А что с типизацией? Любой целочисленный литерал по умолчанию имеет тип int. Если его значение выходит за пределы присваиваемой переменной, происходит ошибка компиляции. При использовании типа long необходимо в конце ставить символ L, обозначающий этот тип:

       long x = 0x1101010110; // Ошибка
       long b = 1342352352351351353L; // Все в порядке
Попытка компиляции приводит к такой ошибке:

Error(11, 26) java: integer number too large: 1101010110

Литералы с плавающей точкой

Числа с плавающей точкой, или дробные числа, могут записываться двумя способами. Первый — в качестве классической десятичной дроби: 3.14159 или 2.718281282459045. Второй — в научном виде, то есть обычная десятичная дробь плюс суффикс в виде символа е или Е и степени 10, на которую нужно умножить указанную дробь. Например, 4.05E-13, это значит 4.05 * 10-13.

       double a = 2.718281828459045;
       double d = 4.05E-13;
       System.out.println("Тип double в классическом виде: " + a);
       System.out.println("Тип double в научном виде: " + d);
Вывод: Тип double в классическом виде: 2.718281828459045 Тип double в научном виде: 4.05E-13 В отличие от целых чисел и систем счисления, научная форма записи сохраняется в переменной и обрабатывается также, как классическая форма. Что с типизацией? Любое число с плавающей точкой создает тип double. Если необходимо использовать тип float, следует добавить в конце символ f или F. В этом случае double будет сведен к типу float. Автоматически этого не происходит:

       float a = 2.718281828459045; // Ошибка
       float d = 4.05E-13F; // Все в порядке
При запуске на этапе компиляции видим такую ошибку:

Error:(11, 27) java: incompatible types: possible lossy conversion from double to float

Строковые литералы

Строковые литералы — это набор символов, заключенных в двойные кавычки. Данный тип используется так же часто, как и числовые литералы. В строке также могут находится служебные символы, которые необходимо экранировать (так называемые escape-последовательности). Пример:

       String simpleString = "Это обычная строка. Такая же стандартная и непримечательная, как и все мы.";
       String uniqueString = "А это необычная \"строка\". Хотя бы потому, что часть \"слов\" в ней в \"кавычках\".";
       System.out.println(simpleString);
       System.out.println(uniqueString);
Вывод: Это обычная строка. Такая же стандартная и непримечательная, как и все мы. А это необычная "строка". Хотя бы потому, что часть "слов" в ней в "кавычках".

Символьные литералы

Символьные литералы в Java представлены кодовой таблицей Unicode, то есть каждый символ — 16-битовое значение. Для обозначения символа в коде его обособляют одинарными кавычками. По опыту использования бывают два вида символов:
  1. Те, что можно ввести с клавиатуры — обычные символы;
  2. Символы, которые просто так с клавиатуры не ввести (символы различных языков, фигуры и так далее).
Обычные символы можно указать в явном виде: ‘,’ или ‘@’. Если символ служебный (например, перенос строки или табуляция), такой символ необходимо экранировать обратным слешем. Символы, которые нельзя просто так ввести с консоли, можно задать в их 16-битовом виде. Для этого необходимо указать код символа с префиксом \u, например ‘\u00F7'. Также символы можно указывать в восьмеричном стиле (трехзначный номер), добавив в начале просто обратный слеш, например ‘\122’. На мой взгляд, гораздо легче использовать \u. Пример использования:

       System.out.println("Амперсанд - " + '&');
       System.out.println("Символ деления - " + '\u00F7');
Вывод: Амперсанд - & Символ деления - ÷

Логические литералы

Самый простой литерал — это логический. Имеется всего 2 значения: false и true, которые указываются явно без различных символов. Такие литералы могут быть присвоены переменным типа boolean или указаны в месте, где ожидается тип boolean (например, в блоке if, хотя такая практика считается, мягко говоря, моветоном).

       boolean flag = false;

       if(true) {
           // Действия будут выполняться всегда.
       }

Джедайская техника с литералами

Благодаря символам в Java можно делать много интересных штук, в числе которых — управление эмоджи. Например, выведем улыбающееся лицо:

       int smile = 0x1F600; // Здесь шестнадцатеричный код эмоджи
       StringBuilder sb = new StringBuilder();
       sb.append(Character.toChars(smile)); // Собираем в StringBuilder
       System.out.println("Улыбающееся лицо: " + sb.toString()); // Выводим
Вывод: Улыбающееся лицо: 😀 Несмотря на то, что отображение эмоджи может быть жутковатым (в зависимости от реализации), это решение неплохо справляется с задачей. Однако в стандартной таблице кодировок сложно искать нужные эмоджи, на официальном сайте раздел Эмотикон скуден. Гораздо проще воспользоваться дополнительными библиотеками.

Литералы в курсе JavaRush

В курсе JavaRush литералы изучаются на 10 уровне в 8 лекции курса Java Syntax, где на примерах объясняется, что такое литералы и зачем они нужны. JavaRush — онлайн-курс по программированию на Java с акцентом на практику: 1200+ задач с моментальной проверкой, мини-проекты, игры.

Заключение

Литералы в Java — удобная вещь в любой программе, однако использовать их необходимо в тех местах, где это уместно. Не стоит хардкодить в исходниках параметры подключения к БД или какие-либо значения, которые могут измениться во время жизненного цикла программы.
Комментарии (50)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Андрии Бумер Уровень 12
9 февраля 2024
Круть! Просто, лаконічно, доступно! Подякував!) І супер класно особисто для мене, що я нарешті все розумію, а н едивлюсь на це як баран на нові ворота)))
Viktoriya Уровень 41
16 ноября 2023
Спасибо за хорошее объяснение!😊
Максим Li Уровень 36
15 ноября 2023
Все хорошо. Когнитивный диссонанс вызвало только то, что литерал из строк тоже примитивное значение. Думаю, что как только java компилятор сталкивается при чтении файла с таким литералом, то он автоматом попадает в объект класса String. Или я ошибаюсь? Что хотел тогда сказать автор, засунув строку к примитивным типам данных?
Anatoly Уровень 30
17 августа 2023
okr
Islam Yunusov Уровень 29
5 августа 2023
Почему в примере с "Джедайской техникой" вы усложнили код, используя класс StringBuilder, если в конечном счёте всё равно преобразовали его в обычный класс String с помощью метода toString()? )) Ведь это можно было сделать проще. Ваш код: int smile = 0x1F600; // Здесь шестнадцатеричный код эмоджи StringBuilder sb = new StringBuilder(); sb.append(Character.toChars(smile)); // Собираем в StringBuilder System.out.println("Улыбающееся лицо: " + sb.toString()); // Выводим Было бы проще: String a = new String(Character.toChars(0x1F600)); System.out.println(a);
FeatHonnar Уровень 16
18 июля 2023
"Все литералы — это примитивные значения (строки, числа, символы, булевы значения). Нельзя создать литерал-объект. Единственный литерал, связанный с объектом — это null." Так строки - это объекты, нет?
kolok Уровень 2
10 июля 2023
круто когда можешь сюда зайти и схавать что дают
Ислам Уровень 33
17 мая 2023
разве строка это примитивный тип данных?
Андрей Уровень 16
14 мая 2023
В статье ошибка!! Не все литералы - примитивные значения. Строковые литералы - это значения, указанные в двойных кавычках, например, "Hello". Они представляют объекты типа String, который не является примитивным типом.
Maxim Belich Уровень 28
26 февраля 2023

byte b = 1; //все ок)
b++; //тоже все ок)
b = b + 1; //ошибка компиляции
обожаю Java