0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы рассмотрим систему типов в Java с высоты птичьего полета, не погружаясь в детали. Но сначала ответим на вопрос, зачем вообще про них знать?</p>
1
<p>В этом уроке мы рассмотрим систему типов в Java с высоты птичьего полета, не погружаясь в детали. Но сначала ответим на вопрос, зачем вообще про них знать?</p>
2
<p>В коде мы все время оперируем данными. Эти данные имеют разную природу, могут быть по-разному организованы, что влияет на удобство работы с ними. Типы преследуют нас на каждом шагу, поэтому без них программирование на Java возможно только на очень базовом уровне.</p>
2
<p>В коде мы все время оперируем данными. Эти данные имеют разную природу, могут быть по-разному организованы, что влияет на удобство работы с ними. Типы преследуют нас на каждом шагу, поэтому без них программирование на Java возможно только на очень базовом уровне.</p>
3
<p>С другой стороны, не пытайтесь запомнить всю эту информацию про типы наизусть - она дается лишь для общего представления. Все важное о типах вы и так выучите в процессе программирования. Глобально, типы данных в Java делятся на две большие группы:</p>
3
<p>С другой стороны, не пытайтесь запомнить всю эту информацию про типы наизусть - она дается лишь для общего представления. Все важное о типах вы и так выучите в процессе программирования. Глобально, типы данных в Java делятся на две большие группы:</p>
4
<ul><li><strong>Примитивные</strong>- предопределены в Java</li>
4
<ul><li><strong>Примитивные</strong>- предопределены в Java</li>
5
<li><strong>Ссылочные</strong>или<strong>не примитивные</strong>- создаются самим программистом, за исключением<em>String</em>и<em>Array</em></li>
5
<li><strong>Ссылочные</strong>или<strong>не примитивные</strong>- создаются самим программистом, за исключением<em>String</em>и<em>Array</em></li>
6
</ul><p>У этих групп есть различия, которые мы разберем позже, когда познакомимся с null и объектно-ориентированным программированием. Пока достаточно знать, что имена примитивных типов начинаются с нижнего регистра (int), а ссылочных с верхнего (String).</p>
6
</ul><p>У этих групп есть различия, которые мы разберем позже, когда познакомимся с null и объектно-ориентированным программированием. Пока достаточно знать, что имена примитивных типов начинаются с нижнего регистра (int), а ссылочных с верхнего (String).</p>
7
<p>Всего в Java восемь примитивных типов данных:</p>
7
<p>Всего в Java восемь примитивных типов данных:</p>
8
<ul><li><em>byte</em></li>
8
<ul><li><em>byte</em></li>
9
<li><em>short</em></li>
9
<li><em>short</em></li>
10
<li><em>int</em></li>
10
<li><em>int</em></li>
11
<li><em>long</em></li>
11
<li><em>long</em></li>
12
<li><em>float</em></li>
12
<li><em>float</em></li>
13
<li><em>double</em></li>
13
<li><em>double</em></li>
14
<li><em>boolean</em></li>
14
<li><em>boolean</em></li>
15
<li><em>char</em></li>
15
<li><em>char</em></li>
16
</ul><p>Рассмотрим первые четыре типа. Это целые числа разного размера:</p>
16
</ul><p>Рассмотрим первые четыре типа. Это целые числа разного размера:</p>
17
<ul><li><em>byte</em>- занимает в памяти 1 байт, значит может хранить числа от -128 до 127</li>
17
<ul><li><em>byte</em>- занимает в памяти 1 байт, значит может хранить числа от -128 до 127</li>
18
<li><em>short</em>- занимает в памяти 2 байта</li>
18
<li><em>short</em>- занимает в памяти 2 байта</li>
19
<li><em>int</em>- занимает в памяти 4 байта</li>
19
<li><em>int</em>- занимает в памяти 4 байта</li>
20
<li><em>long</em>- занимает в памяти 8 байт</li>
20
<li><em>long</em>- занимает в памяти 8 байт</li>
21
</ul><p>Посмотрим на примере такого кода:</p>
21
</ul><p>Посмотрим на примере такого кода:</p>
22
<p>Определение переменной y завершилось с ошибкой, потому что мы указали тип<em>byte</em>, но присвоили переменной значение<em>270</em>, которое выходит за множество допустимых значений.</p>
22
<p>Определение переменной y завершилось с ошибкой, потому что мы указали тип<em>byte</em>, но присвоили переменной значение<em>270</em>, которое выходит за множество допустимых значений.</p>
23
<p>Возникает закономерный вопрос. Зачем аж четыре типа для хранения чисел? Почему бы не сделать один, в который влезает почти любое большое число?</p>
23
<p>Возникает закономерный вопрос. Зачем аж четыре типа для хранения чисел? Почему бы не сделать один, в который влезает почти любое большое число?</p>
24
<p>Технически так сделать можно, но мы находимся в мире инженерных решений. У любого решения всегда есть обратная сторона, поэтому невозможно сделать идеально - придется чем-то пожертвовать. В данном случае, объемом занимаемой памяти. Если оставить только<em>long</em>, то программа, активно оперирующая числами, начнет занимать слишком много места в оперативной памяти, что может быть критично.</p>
24
<p>Технически так сделать можно, но мы находимся в мире инженерных решений. У любого решения всегда есть обратная сторона, поэтому невозможно сделать идеально - придется чем-то пожертвовать. В данном случае, объемом занимаемой памяти. Если оставить только<em>long</em>, то программа, активно оперирующая числами, начнет занимать слишком много места в оперативной памяти, что может быть критично.</p>
25
<p>Такая же логика использовалась для типов<em>float</em>и<em>double</em>. Они оба отвечают за рациональные числа. Разница лишь в том, что<em>double</em>- это двойной<em>float</em>, то есть в памяти он занимает в два раза больше места.</p>
25
<p>Такая же логика использовалась для типов<em>float</em>и<em>double</em>. Они оба отвечают за рациональные числа. Разница лишь в том, что<em>double</em>- это двойной<em>float</em>, то есть в памяти он занимает в два раза больше места.</p>
26
<p>Создатели Java полагаются на разумность программистов, на их способность правильно подобрать нужные типы в зависимости от задачи. Для каких-то экстремальных приложений так и происходит, но в типичной разработке все просто. Программисты выбирают<em>int</em>для целых чисел и<em>double</em>для рациональных.</p>
26
<p>Создатели Java полагаются на разумность программистов, на их способность правильно подобрать нужные типы в зависимости от задачи. Для каких-то экстремальных приложений так и происходит, но в типичной разработке все просто. Программисты выбирают<em>int</em>для целых чисел и<em>double</em>для рациональных.</p>
27
<p>Рассмотрим оставшиеся типы данных.</p>
27
<p>Рассмотрим оставшиеся типы данных.</p>
28
<p>Тип<em>boolean</em>отвечает за логические значения true и false. Им посвящен целый раздел, там мы про него и поговорим.</p>
28
<p>Тип<em>boolean</em>отвечает за логические значения true и false. Им посвящен целый раздел, там мы про него и поговорим.</p>
29
<p>Особняком стоит тип<em>char</em>- символ. Это не строка, у него другой способ определения - через одиночные кавычки:</p>
29
<p>Особняком стоит тип<em>char</em>- символ. Это не строка, у него другой способ определения - через одиночные кавычки:</p>
30
<p>Строка, состоящая из одного символа - это не символ. Кажется, нелогично, но с точки зрения типов все так и должно быть, со временем вы это прочувствуете.</p>
30
<p>Строка, состоящая из одного символа - это не символ. Кажется, нелогично, но с точки зрения типов все так и должно быть, со временем вы это прочувствуете.</p>
31
<p>Извлечение символа из строки извлекает как раз символ, а не строку, состоящую из одного символа:</p>
31
<p>Извлечение символа из строки извлекает как раз символ, а не строку, состоящую из одного символа:</p>
32
<p>Хорошо, а где тип данных<em>String</em>- строка? Дело в том, что она не является примитивным типом. Внутри она представляет собой массив символов. Несмотря на это техническое различие, строки используются наравне с примитивными типами без особых отличий.</p>
32
<p>Хорошо, а где тип данных<em>String</em>- строка? Дело в том, что она не является примитивным типом. Внутри она представляет собой массив символов. Несмотря на это техническое различие, строки используются наравне с примитивными типами без особых отличий.</p>