User Эллеонора Керри
Эллеонора Керри
41 уровень

Литералы в 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 — удобная вещь в любой программе, однако использовать их необходимо в тех местах, где это уместно. Не стоит хардкодить в исходниках параметры подключения к БД или какие-либо значения, которые могут измениться во время жизненного цикла программы.
Комментарии (17)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ruslan Nikitin Уровень 11, Красноярск, Россия
14 мая 2022
https://javarush.ru/groups/posts/1399-stroki-v-java из статьи: В языке программирования Java строки — это объект. В данном случае «Hello World!» — это строковый литерал (т.е. константа) состоящая из последовательности символов, заключенных в кавычки. Всякий раз, когда компилятор сталкивается со строковым литералом, он создает объект типа String со значением, в нашем случае, «Hello World!». Так что такое строки, объект или примитив в виде сложной структуры из таблицы символов? путаница однако. может кому будет полезно В чем разница между строковым литералом и строковым объектом в Java
Юлия Сабурова Уровень 13, Москва, Russian Federation
27 января 2022
Это обычная строка. Такая же стандартная и непримечательная, как и все мы.😢
EvGenbl4 Уровень 14, Екатеринбург, Russian Federation
26 января 2022
Если нажать на числе в идее Alt+Enter то можно конвертировать одно в другое
Антон Уровень 3, Ростов-на-Дону
15 мая 2021
При записи литерала типа сhar в восьмеричной записи его значение не может превышать \377, что включает только первые 256 символов.
fog Уровень 16
7 мая 2021
System.out.println("Это строковой литерал".getClass().getName());
Кто после этого скажет, что строковой литерал не является объектом?
Игорь Мистюрин Уровень 2, Одесса, Украина
22 января 2020
Строка (String) - является сложным типом данных, которая хранит свои данные в виде таблицы. Где каждый символ будь то запятая или буква, является примитивным (простым) типом Char.
18 июля 2019
Строка - не примитив
Anonymous #1384518 Уровень 35 Expert
13 июля 2019
От себя добавлю, что числа можно указывать с использованием разделителя, используя символ нижнего подчёркивания. Вот так:

long l = 100_000_000_000;
Это появилось с 7 Javы для того, чтобы презентовать число в удобочитаемом виде. Причем количество символов _ может быть любым, как подряд идущих, так и по одному через сколь угодно цифр. Главное они не должны быть в начале или конце числа.

int i = 2__5________01_8;
int j = 1_7__; // Недопустимо