HTML Diff
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&lt;String&gt; strings = new ArrayList&lt;&gt;(); int listSize = strings.size();<p>Тип возвращаемого значения подсказывает, сколько элементов можно хранить в списке или множестве. Максимум для int - 2 147 483 647.</p>
34 List&lt;String&gt; strings = new ArrayList&lt;&gt;(); 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>