0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#База знаний</a></p>
1
<p><a>#База знаний</a></p>
2
<ul><li>25 ноя 2021</li>
2
<ul><li>25 ноя 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Рассказываем, как джависту не запутаться во всех этих byte, short, boolean, char и String.</p>
4
</ul><p>Рассказываем, как джависту не запутаться во всех этих byte, short, boolean, char и String.</p>
5
<p>Программист, преподаватель Skillbox. Пишет про Java. </p>
5
<p>Программист, преподаватель Skillbox. Пишет про Java. </p>
6
<p>Основа любого языка программирования - данные и операции с ними. Java не исключение. Это строго типизированный язык, поэтому типы данных значат в нём очень многое.</p>
6
<p>Основа любого языка программирования - данные и операции с ними. Java не исключение. Это строго типизированный язык, поэтому типы данных значат в нём очень многое.</p>
7
<p>Java следит за тем, чтобы все переменные, выражения и значения соответствовали своему типу данных. Поэтому операции, которые допустимы для одного типа, нельзя провести с другим - тип переменной определяет, какие операции с ней можно выполнить.</p>
7
<p>Java следит за тем, чтобы все переменные, выражения и значения соответствовали своему типу данных. Поэтому операции, которые допустимы для одного типа, нельзя провести с другим - тип переменной определяет, какие операции с ней можно выполнить.</p>
8
<p>Когда код на Java компилируется, машина проверяет соответствие типов операндов во всех методах, конструкторах и других операторах. Если в программе есть хотя бы одна недопустимая операция, компилятор не превратит её в байт-код. Поэтому контроль типов данных помогает уменьшить количество ошибок при написании программы.</p>
8
<p>Когда код на Java компилируется, машина проверяет соответствие типов операндов во всех методах, конструкторах и других операторах. Если в программе есть хотя бы одна недопустимая операция, компилятор не превратит её в байт-код. Поэтому контроль типов данных помогает уменьшить количество ошибок при написании программы.</p>
9
<p>В этой статье мы рассмотрим:</p>
9
<p>В этой статье мы рассмотрим:</p>
10
<ul><li>какие типы данных есть в Java;</li>
10
<ul><li>какие типы данных есть в Java;</li>
11
<li>чем различаются примитивные и ссылочные переменные;</li>
11
<li>чем различаются примитивные и ссылочные переменные;</li>
12
<li>какие у переменных бывают значения по умолчанию;</li>
12
<li>какие у переменных бывают значения по умолчанию;</li>
13
<li>как упаковка и распаковка помогают превратить примитивные переменные в объект.</li>
13
<li>как упаковка и распаковка помогают превратить примитивные переменные в объект.</li>
14
</ul><p>В Java типы данных делят на две большие группы: примитивные и ссылочные. В состав примитивных типов (или просто примитивов) входят четыре подвида и восемь типов данных:</p>
14
</ul><p>В Java типы данных делят на две большие группы: примитивные и ссылочные. В состав примитивных типов (или просто примитивов) входят четыре подвида и восемь типов данных:</p>
15
<p>1) целые числа (byte, short, int, long);</p>
15
<p>1) целые числа (byte, short, int, long);</p>
16
<p>2) числа с плавающей точкой (float, double);</p>
16
<p>2) числа с плавающей точкой (float, double);</p>
17
<p>3) логический (boolean);</p>
17
<p>3) логический (boolean);</p>
18
<p>4) символьный (char).</p>
18
<p>4) символьный (char).</p>
19
<p>Ссылочные типы данных ещё называют ссылками. К ним относятся все классы, интерфейсы, массивы, а также тип данных String.</p>
19
<p>Ссылочные типы данных ещё называют ссылками. К ним относятся все классы, интерфейсы, массивы, а также тип данных String.</p>
20
<p>Хотя у примитивов и ссылок много общего, между ними есть существенные различия. И главное различие - в том, что именно в них хранится.</p>
20
<p>Хотя у примитивов и ссылок много общего, между ними есть существенные различия. И главное различие - в том, что именно в них хранится.</p>
21
Примитивные переменныеСсылочные переменныеХранят<strong>значение</strong>Хранят<strong>адрес объекта в памяти</strong>, на который ссылаются (отсюда и название).<p>Используются для<strong>доступа</strong>к объектам (его нельзя получить, если на объект нет ссылки)</p>
21
Примитивные переменныеСсылочные переменныеХранят<strong>значение</strong>Хранят<strong>адрес объекта в памяти</strong>, на который ссылаются (отсюда и название).<p>Используются для<strong>доступа</strong>к объектам (его нельзя получить, если на объект нет ссылки)</p>
22
Создаются<strong>присваиванием</strong>значенияСоздаются через<strong>конструкторы</strong>классов (присваивание только создаёт вторую<strong>ссылку</strong>на существующий объект)Имеют строго заданный<strong>диапазон</strong>допустимых значенийПо умолчанию их значение - nullВ аргументы методов попадают<strong>копии</strong>значения переменной (это передача по значению)В методы передаётся<strong>значение ссылки</strong>- операция выполняется над оригинальным объектом, на который ссылается переменнаяМогут использоваться для ссылки на любой объект объявленного или совместимого типа<p>Вот пример использования примитивных и ссылочных типов данных:</p>
22
Создаются<strong>присваиванием</strong>значенияСоздаются через<strong>конструкторы</strong>классов (присваивание только создаёт вторую<strong>ссылку</strong>на существующий объект)Имеют строго заданный<strong>диапазон</strong>допустимых значенийПо умолчанию их значение - nullВ аргументы методов попадают<strong>копии</strong>значения переменной (это передача по значению)В методы передаётся<strong>значение ссылки</strong>- операция выполняется над оригинальным объектом, на который ссылается переменнаяМогут использоваться для ссылки на любой объект объявленного или совместимого типа<p>Вот пример использования примитивных и ссылочных типов данных:</p>
23
int a = 5; int b = a; //мы создали две переменных и два различных значения, которые содержат число 5 Cat barsik = new Cat(); //мы создали объект Cat, и переменной barsik присвоена ссылка на этот объект Cat murka = barsik; //создали две ссылки на один и тот же объект Cat<p>Как мы уже отмечали, в зависимости от типа данных у каждой переменной есть значение по умолчанию. Оно присваивается при её создании.</p>
23
int a = 5; int b = a; //мы создали две переменных и два различных значения, которые содержат число 5 Cat barsik = new Cat(); //мы создали объект Cat, и переменной barsik присвоена ссылка на этот объект Cat murka = barsik; //создали две ссылки на один и тот же объект Cat<p>Как мы уже отмечали, в зависимости от типа данных у каждой переменной есть значение по умолчанию. Оно присваивается при её создании.</p>
24
<p>В этом примере значения по умолчанию получат все переменные:</p>
24
<p>В этом примере значения по умолчанию получат все переменные:</p>
25
private int a; private double b; private String text;<p>А в этом примере значения получают только переменные класса: когда мы создадим класс Cat, по умолчанию weight будет равен 0.0.</p>
25
private int a; private double b; private String text;<p>А в этом примере значения получают только переменные класса: когда мы создадим класс Cat, по умолчанию weight будет равен 0.0.</p>
26
public class Cat { private double weight; public void setWeight(double weight) { this.weight = weight; } public double getWeight() { return weight; } }<p>Но локальные переменные нужно инициировать сразу при создании. Если написать просто int sum; , при использовании переменной компилятор выдаст ошибку: java: variable a might not have been initialized.</p>
26
public class Cat { private double weight; public void setWeight(double weight) { this.weight = weight; } public double getWeight() { return weight; } }<p>Но локальные переменные нужно инициировать сразу при создании. Если написать просто int sum; , при использовании переменной компилятор выдаст ошибку: java: variable a might not have been initialized.</p>
27
private static int sum(int[] prices) { int sum = 0; for (int price : prices) { sum += price; } return sum; }<p>У примитивов есть строгие рамки допустимых значений по умолчанию и диапазоны значений - для удобства мы собрали их в таблицу.</p>
27
private static int sum(int[] prices) { int sum = 0; for (int price : prices) { sum += price; } return sum; }<p>У примитивов есть строгие рамки допустимых значений по умолчанию и диапазоны значений - для удобства мы собрали их в таблицу.</p>
28
Диапазоны значений примитивов в языке Java. Изображение: Skillbox Media<p>Целочисленные типы данных различаются только диапазонами значений. Их основная задача - хранить информацию для вычислений.</p>
28
Диапазоны значений примитивов в языке Java. Изображение: Skillbox Media<p>Целочисленные типы данных различаются только диапазонами значений. Их основная задача - хранить информацию для вычислений.</p>
29
<p><strong>Тип</strong>byte. Эти переменные используют, чтобы работать с потоком данных, который получили из файла или по сети.</p>
29
<p><strong>Тип</strong>byte. Эти переменные используют, чтобы работать с потоком данных, который получили из файла или по сети.</p>
30
//объявляем переменные с типом данных byte byte a; byte b; byte c; //инициализируем переменные значениями a = 0; b = 0; c = -129; //это пример ошибки во вводе данных. Такое значение не входит в диапазон значений byte //выводим данные из переменных System.out.println(a); System.out.println(b);<p><strong>Тип</strong>short. По сравнению с byte у него увеличенный, но всё же ограниченный диапазон значений. Применяют short редко - например, когда нужно экономить память.</p>
30
//объявляем переменные с типом данных byte byte a; byte b; byte c; //инициализируем переменные значениями a = 0; b = 0; c = -129; //это пример ошибки во вводе данных. Такое значение не входит в диапазон значений byte //выводим данные из переменных System.out.println(a); System.out.println(b);<p><strong>Тип</strong>short. По сравнению с byte у него увеличенный, но всё же ограниченный диапазон значений. Применяют short редко - например, когда нужно экономить память.</p>
31
//инициализируем переменную типа short short primerShort = 255;<p><strong>Тип</strong>int. В языке Java int - самый популярный тип целочисленных данных. При вычислениях в виртуальной машине остальные целочисленные типы (byte, short) занимают столько же памяти, сколько int.</p>
31
//инициализируем переменную типа short short primerShort = 255;<p><strong>Тип</strong>int. В языке Java int - самый популярный тип целочисленных данных. При вычислениях в виртуальной машине остальные целочисленные типы (byte, short) занимают столько же памяти, сколько int.</p>
32
//инициализируем переменную типа int int closeToMiddle = 0;<p>Множество классов в Java обладают значениями типа int - например, длина массива внутри класса String выражается целочисленным значением int:</p>
32
//инициализируем переменную типа int int closeToMiddle = 0;<p>Множество классов в Java обладают значениями типа int - например, длина массива внутри класса String выражается целочисленным значением int:</p>
33
String[] strings = new String[50]; int arrayLength = strings.length;<p>Если переменная хранит количество элементов в коллекциях List, Set и Map, она тоже относится к типу int:</p>
33
String[] strings = new String[50]; int arrayLength = strings.length;<p>Если переменная хранит количество элементов в коллекциях List, Set и Map, она тоже относится к типу int:</p>
34
List<String> strings = new ArrayList<>(); int listSize = strings.size();<p>Тип возвращаемого значения подсказывает, сколько элементов можно хранить в списке или множестве. Максимум для int - 2 147 483 647.</p>
34
List<String> strings = new ArrayList<>(); int listSize = strings.size();<p>Тип возвращаемого значения подсказывает, сколько элементов можно хранить в списке или множестве. Максимум для int - 2 147 483 647.</p>
35
<p><strong>Тип</strong>long применяют, когда нужно работать с большими целочисленными значениями.</p>
35
<p><strong>Тип</strong>long применяют, когда нужно работать с большими целочисленными значениями.</p>
36
//инициализируем переменные типа long long c = -9223372036854; //при компиляции появится ошибка long right = -9223372036854L;<p>По умолчанию компилятор воспринимает целое число как int, а 9 223 372 036 854 намного больше его максимального значения, поэтому в коде программы нужно явно указать тип long.</p>
36
//инициализируем переменные типа long long c = -9223372036854; //при компиляции появится ошибка long right = -9223372036854L;<p>По умолчанию компилятор воспринимает целое число как int, а 9 223 372 036 854 намного больше его максимального значения, поэтому в коде программы нужно явно указать тип long.</p>
37
<p>Тип данных double используют для работы с десятичными числами.</p>
37
<p>Тип данных double используют для работы с десятичными числами.</p>
38
//инициализируем переменную типа double double sample = 59.36;<p>Тип float используют как экономичный вариант хранения больших массивов данных с плавающей точкой.</p>
38
//инициализируем переменную типа double double sample = 59.36;<p>Тип float используют как экономичный вариант хранения больших массивов данных с плавающей точкой.</p>
39
<p>Когда переменной присваивают тип float, язык Java воспринимает её как тип данных double. Чтобы этого не происходило, нужно добавлять в конце переменной символ f или F.</p>
39
<p>Когда переменной присваивают тип float, язык Java воспринимает её как тип данных double. Чтобы этого не происходило, нужно добавлять в конце переменной символ f или F.</p>
40
<p>Даже если у переменных float и double будут одинаковые значения, язык Java обработает их по-разному, поэтому они будут занимать разный объём памяти.</p>
40
<p>Даже если у переменных float и double будут одинаковые значения, язык Java обработает их по-разному, поэтому они будут занимать разный объём памяти.</p>
41
//инициализация переменных типа float float f = 1.457; //Java воспримет эту переменную как тип данных double и выдаст ошибку компиляции float floatNumber = 27.5f; //правильный способ float otherFloat = (float) 78.64; //другой вариант инициализации переменной типа float во избежание путаницы с double<p>Не стоит использовать float, когда в вычислениях нужна точность больше пяти знаков после запятой. Oracle пишет об этом в статье "<a>Primitive Data Types</a>".</p>
41
//инициализация переменных типа float float f = 1.457; //Java воспримет эту переменную как тип данных double и выдаст ошибку компиляции float floatNumber = 27.5f; //правильный способ float otherFloat = (float) 78.64; //другой вариант инициализации переменной типа float во избежание путаницы с double<p>Не стоит использовать float, когда в вычислениях нужна точность больше пяти знаков после запятой. Oracle пишет об этом в статье "<a>Primitive Data Types</a>".</p>
42
<p>Чтобы работать с логическими значениями, используют тип данных boolean - это его единственное применение. У такой переменной может быть только два значения: false (ложь) и true (истина).</p>
42
<p>Чтобы работать с логическими значениями, используют тип данных boolean - это его единственное применение. У такой переменной может быть только два значения: false (ложь) и true (истина).</p>
43
//инициализируем переменные типа boolean boolean isWorking = true; boolean isAlive = false;<p>В Java boolean - отдельная переменная. Это не аналог 1 или 0, как, например, в JavaScript и PHP.</p>
43
//инициализируем переменные типа boolean boolean isWorking = true; boolean isAlive = false;<p>В Java boolean - отдельная переменная. Это не аналог 1 или 0, как, например, в JavaScript и PHP.</p>
44
<p>Тип данных char используют, чтобы хранить в переменных любые 16-разрядные символы Unicode. Но их нужно записывать строго в одинарные кавычки ' ', и только по одному.</p>
44
<p>Тип данных char используют, чтобы хранить в переменных любые 16-разрядные символы Unicode. Но их нужно записывать строго в одинарные кавычки ' ', и только по одному.</p>
45
<p>Не стоит путать символьные и строковые переменные - 'ж' не равно "ж", потому что в двойных кавычках хранится тип данных String. А это уже не примитив.</p>
45
<p>Не стоит путать символьные и строковые переменные - 'ж' не равно "ж", потому что в двойных кавычках хранится тип данных String. А это уже не примитив.</p>
46
<p><strong>Пример кода</strong></p>
46
<p><strong>Пример кода</strong></p>
47
//инициализируем переменные типа char char symbol1 = 1078; //по индексу символа в таблице UTF-8 char symbol2 = 'ж'; //по значению символа char symbol3 = '\u0436'; //через шестнадцатеричную форму Unicode (это всё ещё "ж") //вызываем вывод информации System.out.println("symbol1 contains " + symbol1); System.out.println("symbol2 contains " + symbol2); System.out.println("symbol3 contains " + symbol3); //во всех случаях будет выдан один и тот же символ - "ж"<p><strong>Вывод в консоли</strong></p>
47
//инициализируем переменные типа char char symbol1 = 1078; //по индексу символа в таблице UTF-8 char symbol2 = 'ж'; //по значению символа char symbol3 = '\u0436'; //через шестнадцатеричную форму Unicode (это всё ещё "ж") //вызываем вывод информации System.out.println("symbol1 contains " + symbol1); System.out.println("symbol2 contains " + symbol2); System.out.println("symbol3 contains " + symbol3); //во всех случаях будет выдан один и тот же символ - "ж"<p><strong>Вывод в консоли</strong></p>
48
symbol1 contains ж symbol2 contains ж symbol3 contains ж<p>В плане дефолтных значений ссылочные переменные проще примитивов. По умолчанию их значение - null: это означает отсутствие ссылки или то, что ссылка ни на что не указывает.</p>
48
symbol1 contains ж symbol2 contains ж symbol3 contains ж<p>В плане дефолтных значений ссылочные переменные проще примитивов. По умолчанию их значение - null: это означает отсутствие ссылки или то, что ссылка ни на что не указывает.</p>
49
<p>Но если вызвать метод объекта от переменной со значением null, это приведёт к ошибке NullPointerException:</p>
49
<p>Но если вызвать метод объекта от переменной со значением null, это приведёт к ошибке NullPointerException:</p>
50
Cat barsik = null; barsik.meow(); //здесь появится ошибка NullPointerException, потому что у переменной barsik значение null<p>В ссылочные типы данных входит и String - это класс из стандартной библиотеки Java. Он не относится к примитивам, но его повсеместно используют, чтобы хранить текстовые данные.</p>
50
Cat barsik = null; barsik.meow(); //здесь появится ошибка NullPointerException, потому что у переменной barsik значение null<p>В ссылочные типы данных входит и String - это класс из стандартной библиотеки Java. Он не относится к примитивам, но его повсеместно используют, чтобы хранить текстовые данные.</p>
51
<p>Пример использования String:</p>
51
<p>Пример использования String:</p>
52
//создаём строку двойными кавычками "" String string = "This day was awesome"; //альтернативный способ создания строки - через конструктор String string = new String ("This day was awesome");<p>Строчные переменные можно склеивать оператором +, который используют для конкатенации.</p>
52
//создаём строку двойными кавычками "" String string = "This day was awesome"; //альтернативный способ создания строки - через конструктор String string = new String ("This day was awesome");<p>Строчные переменные можно склеивать оператором +, который используют для конкатенации.</p>
53
<p><strong>Пример кода</strong></p>
53
<p><strong>Пример кода</strong></p>
54
String stringFirst = "New adventures "; String stringSecond= "are waiting "; String stringThird = "for you"; String string = stringFirst + stringSecond + stringThird; System.out.println(string);<p><strong>Вывод в консоли</strong></p>
54
String stringFirst = "New adventures "; String stringSecond= "are waiting "; String stringThird = "for you"; String string = stringFirst + stringSecond + stringThird; System.out.println(string);<p><strong>Вывод в консоли</strong></p>
55
New adventures are waiting for you<p>Иногда с примитивами приходится работать как с объектами - например, передавать им значение по ссылке или создавать список из чисел (а списки работают только с объектами).</p>
55
New adventures are waiting for you<p>Иногда с примитивами приходится работать как с объектами - например, передавать им значение по ссылке или создавать список из чисел (а списки работают только с объектами).</p>
56
<p>Поэтому у каждого примитива есть соответствующий ему ссылочный тип - его называют классом-обёрткой. В таких классах хранятся методы для преобразования типов данных, а также другие константы и методы, которые применяются при работе с примитивами.</p>
56
<p>Поэтому у каждого примитива есть соответствующий ему ссылочный тип - его называют классом-обёрткой. В таких классах хранятся методы для преобразования типов данных, а также другие константы и методы, которые применяются при работе с примитивами.</p>
57
<strong>Тип данных</strong><strong>Класс-обёртка</strong>byteByteshortShortintIntegerlongLongcharCharacterfloatFloatdoubleDoublebooleanBoolean<p>Ссылочные типы данных (обёртки) пишут с прописной буквы, потому что это полноценные классы. А в Java названия всех классов должны начинаться с большой буквы - язык чувствителен к регистру.</p>
57
<strong>Тип данных</strong><strong>Класс-обёртка</strong>byteByteshortShortintIntegerlongLongcharCharacterfloatFloatdoubleDoublebooleanBoolean<p>Ссылочные типы данных (обёртки) пишут с прописной буквы, потому что это полноценные классы. А в Java названия всех классов должны начинаться с большой буквы - язык чувствителен к регистру.</p>
58
<p>Чтобы создать ссылку на примитивный тип данных, нужно использовать соответствующую обёртку:</p>
58
<p>Чтобы создать ссылку на примитивный тип данных, нужно использовать соответствующую обёртку:</p>
59
//пример использования классов-оболочек (упаковка) long g = 5509768L; Long boxed; boxed = new Long(g); //обычное создание через конструктор boxed = Long.valueOf (g); //фабричный метод boxed = g; //автоматическая упаковка. Компилятор заменит её на вызов Long.valueOf(g)<p>Если использовать valueOf, процесс упаковывания становится проще и быстрее, потому что он проводит кэширование и потребляет меньше памяти, а конструктор всегда создаёт новый объект.</p>
59
//пример использования классов-оболочек (упаковка) long g = 5509768L; Long boxed; boxed = new Long(g); //обычное создание через конструктор boxed = Long.valueOf (g); //фабричный метод boxed = g; //автоматическая упаковка. Компилятор заменит её на вызов Long.valueOf(g)<p>Если использовать valueOf, процесс упаковывания становится проще и быстрее, потому что он проводит кэширование и потребляет меньше памяти, а конструктор всегда создаёт новый объект.</p>
60
//пример использования классов-оболочек (распаковка) Long boxed = 200L; long g; g = boxed.longValue(); //явная распаковка g = boxed; //автоматическая распаковка<p>Классы-обёртки полезны, когда нужно одновременно работать и с числами, и с объектами - например, в коллекциях.</p>
60
//пример использования классов-оболочек (распаковка) Long boxed = 200L; long g; g = boxed.longValue(); //явная распаковка g = boxed; //автоматическая распаковка<p>Классы-обёртки полезны, когда нужно одновременно работать и с числами, и с объектами - например, в коллекциях.</p>
61
<p>В этой статье мы рассмотрели примитивные типы данных (byte, short, int, long, float, double, char и boolean), ссылочные типы данных (String и остальные). Вы узнали, чем они отличаются друг от друга и какие значения принимают по умолчанию.</p>
61
<p>В этой статье мы рассмотрели примитивные типы данных (byte, short, int, long, float, double, char и boolean), ссылочные типы данных (String и остальные). Вы узнали, чем они отличаются друг от друга и какие значения принимают по умолчанию.</p>
62
<p>В следующей статье мы расскажем, что можно делать с этими переменными с помощью арифметических и логических операторов языка Java.</p>
62
<p>В следующей статье мы расскажем, что можно делать с этими переменными с помощью арифметических и логических операторов языка Java.</p>
63
<a>Курс с трудоустройством: "Профессия Java-разработчик + ИИ" Узнать о курсе</a>
63
<a>Курс с трудоустройством: "Профессия Java-разработчик + ИИ" Узнать о курсе</a>