Литералы в 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 — удобная вещь в любой программе, однако использовать их необходимо в тех местах, где это уместно. Не стоит хардкодить в исходниках параметры подключения к БД или какие-либо значения, которые могут измениться во время жизненного цикла программы.
Комментарии (34)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Maxim Belich Уровень 28
26 февраля 2023

byte b = 1; //все ок)
b++; //тоже все ок)
b = b + 1; //ошибка компиляции
обожаю Java
ChupaFx Уровень 18
3 февраля 2023
Что-то у меня вместо смайлика выводится "?"..
Maxim Zakaryan Уровень 10
6 декабря 2022
Не совсем понял вот этот момент В переменную 'а' записываем значение в восьмеричной СС (через символ '0' в начале), а компилятором указывается ошибка на превышение допустимого значения. Но как он распознал восьмеричное число, в котором указана цифра '9', которой в этой СС быть не может
Anonymous #2447435 Уровень 14
22 ноября 2022
Согласен с нижеотписавшимися - очень понятное изложение материала! Спасибо!!
logvinata Уровень 13
6 августа 2022
Эта статья намного лучше, чем та, что в рекламируемом курсе
Benjam1nBTN Уровень 24
26 июля 2022
Ниче не понимаю: Мы пишем "float a = 2.71828;" - создали переменную "a" типа "float", зачем на конце присваиваемого значения ставить ещё "f"?
Vlad Уровень 28
11 июня 2022
можно все лекции такими доступными писать
Ant Уровень 25
14 мая 2022
https://javarush.com/groups/posts/1399-stroki-v-java из статьи: В языке программирования Java строки — это объект. В данном случае «Hello World!» — это строковый литерал (т.е. константа) состоящая из последовательности символов, заключенных в кавычки. Всякий раз, когда компилятор сталкивается со строковым литералом, он создает объект типа String со значением, в нашем случае, «Hello World!». Так что такое строки, объект или примитив в виде сложной структуры из таблицы символов? путаница однако. может кому будет полезно В чем разница между строковым литералом и строковым объектом в Java
Юлия Сабурова Уровень 13
27 января 2022
Это обычная строка. Такая же стандартная и непримечательная, как и все мы.😢
EvGenbl4 Уровень 14
26 января 2022
Если нажать на числе в идее Alt+Enter то можно конвертировать одно в другое