Java — строго типизированный объектно-ориентированный язык программирования. Переменные и выражения имеют конкретный тип и каждый тип строго определен. Все операции присваивания проверяются на соответствия типов.
Примитивные типы
Целые числа
тип | размер (биты) |
byte | 8 |
short | 16 |
int | 32 |
long | 64 |
Диапазон значений определяется по формуле
Если значения выходят за пределы допустимого интервала, то такие значения преобразуются к соответствующим из интервала исходного типа. На рис. 1 продемонстрирована графическая интерпретация преобразования значений типа byte, которые выходят за пределы допустимого интервала.

Пример преобразования значения типа byte к значению из интервала допустимых значений данного типа
byte x=127;
System.out.println(++x);//-128
Числа с плавающей точкой
тип | размер (биты) |
float | 32 |
double | 64 |
float f = 23.1f;
double d = 24.4;
Символы
тип | размер (биты) |
char | 16 |
Данный тип используется для хранения одиночного символа. Символы в java представлены в кодировке Unicode
char ch1 = 'a';//символ 'a'
char ch2 = 65;//соответствующий ASCII-коду 65 ('A')
char ch3 = '\u03A9';//соответствует символу 'Ω'
Логические значения
тип | размер (биты) |
boolean | зависит от JVM |
Диапазон значений: true, false
boolean a = true;
boolean b = false;
Литералы
Литерал - это представление операнда с постоянным значением
Целочисленные
Основание | Конструкция | Допустимые обозначения | Пример |
2 | 0bN или 0BN | 0-1 | 0b1010, 0B101 |
8 | 0N | 0-7 | 01, 02, 06 |
10 | N | 0-9 | 2, 32, 123 |
16 | 0xN или 0XN | 0-9-A-F | 0xAF, 0x23 |
N - число
Правила, применимые к целочисленным литералам
Целочисленный литерал указывается как тип int по умолчанию
Когда значение присваивается к типу byte, short или char, то ошибки не происходит, если значение находится в интервале допустимых значений данного типа
Для применения к типу long необходимо указать обозначение L или l (0x7L, 20L, 07L)
Для разделения литералов используется знак подчеркивания ( int x=123_456_789; )
С плавающей точкой
Форма | По основанию 10 | По основанию 16 |
Стандартная | 2.0, 3.14 | ~ |
Экспоненциальная | 10.0E0 или 8250e-2 | 0xA.0p0 или 0XA5p-1 |
Правила, применимые к литералам с плавающей точкой
По умолчанию литерал имеет тип double, а также можно указать и явно, добавив d или D ( double x=3.14D )
Чтобы обозначить тип float, то нужно добавить f или F ( float x=3.14f )
Для разделения литералов используется знак подчеркивания ( double d=0XA_5p-1 или 1_2_3.1_2_3)
Литералы с экспоненциальной формой записи после p содержит степень числа два, на которое умножается заданное число. ( 0x0.Ap1 (16) = 0.625*2 )
Логические
Тип boolean может иметь только два значения: true, false
Символьные
Символы в Java - это символы из набора символов Юникод. Могут быть преобразованы в целые значения над которыми можно производить целочисленные операции.
Управляющая последовательность - это способ задания символа, который является специфичным или выходит за пределы ASC2
char s1 = 'A';char s2 = 'g';
Символьные литералы помещаются в одинарные кавычки. Символы указываются из кодировки ASC2
char s1 = '\'';char s2 = '\n';
В данном случае косая черта используется для указания специальных символов
char s1 = '\141';char s2 = '\u1212';
Так как количество символов в Unicode больше чем в ASC2, то для их указания используется числовой код как в восьмеричной форме, так и в шестнадцатеричной. (\ddd - восьмеричный, \uxxxx - шестнадцатеричный)
Управляющие последовательности
\ddd | восьмеричный символ |
\uxxxx | шестнадцатеричный символ |
\' | одинарная кавычка |
\\ | обратная косая черта |
\r | возврат каретки |
\n | новая строка |
\f | подача страницы |
\t | табуляция |
\b | возврат на одну позицию |
String s = "Hello World\b";
System.out.println(s);//Hello Worl
System.out.println("Страница 1");
System.out.println("\f");
System.out.println("Страница 2");
System.out.println("\\Hello\\");// \Hello\
System.out.println('\u8511');//蔑
Строковые
Строковые литералы помещаются в двойные кавычки
String str="asd asd asd";
String str="\111 asd asd asd";//I asd asd asd
Управляющие последовательности в строковых литералах имеют аналогичное поведение, что и в символьных литералах
Переменные
Форма объявления переменной: type name [=value] [, name [=value] ... ]
name - это имя переменной, value - значение, type - обозначает один из примитивных типов, класс или интерфейс
int a = 3, b, c = 6;
byte z, d;
char x = 'x';
Идентификатор - это последовательность символов для именования классов, методов и переменных
Правила наименования переменных
Не должны начинаться с цифры
Учитывается регистр
Строчные и прописные буквы, цифры, знаки подчеркивания, $
Возможны символы из кириллицы и других кодировок, но не рекомендуется
Преобразование типов
Автоматическое
Условия автоматического преобразования типов
Оба типа совместимы
Длина целевого типа больше длины исходного типа
При выполнении данных условий выполняется расширяющее преобразование (рисунок 2)

Преобразования типов данных
boolean | byte | short | char | int | long | float | double | |
boolean | ~ | n | n | n | n | n | n | n |
byte | n | ~ | y | c | y | y | y | y |
short | n | c | ~ | c | y | y | y | y |
char | n | c | c | ~ | y | y | y | y |
int | n | c | c | c | ~ | y | y* | y |
long | n | c | c | c | c | ~ | y* | y* |
float | n | c | c | c | c | c | ~ | y |
double | n | c | c | c | c | c | c | ~ |
N - нельзя преобразовать; Y - автоматическое расширяющее преобразование; Y* - автоматическое расширяющее преобразование с потерей точности; C - сужающее преобразование
Явное
Приведение типов - это явное преобразование типов
Форма: (type) value, где type - целевой тип, value - значение, которое требуется преобразовать
Виды преобразований
Сужающее преобразование. Это обратный процесс к преобразованию расширения. Например преобразование int к byte не может быть выполнено автоматически так как не выполнены условия автоматического преобразования. А именно длина целевого типа меньше исходного, но по условиям требуется чтобы длина была больше
Усечение. Это преобразование числа с плавающей точкой к целочисленному значению. Как правило при таком преобразовании отбрасывается дробная часть. После чего происходит сужающее преобразование или присвоение значения к целевому типу
int a = 474;
byte b = (byte) a;
Пример сужающего преобразования
float a = 474.323f;
byte b = (byte) a;
Пример усечения
Продвижение типов
byte b=50;
b=b*2;//java: incompatible types: possible lossy conversion from int to byte
В данном случае мы видим ошибку несовместимости типов, так как выражение b*2 является типом int. И автоматическое преобразование не работает так как целевой тип меньше чем исходный. (byte меньше чем int). В таком случае требуется явное приведение типов.
Правила продвижения типов
Сначала значения типа byte, short, char продвигаются к типу int
Затем к типу long, если есть операнд такого типа
Затем к типу float, если есть операнд такого типа
Затем к типу double, если есть операнд такого типа
int x=999_999_999;
int y=999_999_999;
long r=x*y;//808348673
Так как выражение продвигается к int, но диапазона не хватает, то производится операция по модулю для типа int. Чтобы исправить данную ситуацию, то надо один из типов привести к типу long