logo
АСНИ

Основные идеи Примитивные типы

В языке Java только 8 примитивных (скалярных, простых) типовbooleanbytecharshortintlongfloat,double. Существует также вспомогательный девятый примитивный тип — void, однако переменные и поля такого типа не могут быть объявлены в коде, а сам тип используется только для описания соответствующего ему класса, для использовании при рефлексии. Кроме того, с помощью классаVoid можно узнать, является ли определённый метод типа void:Hello.class.getMethod("main", Array.newInstance(String.class, 0).getClass()).getReturnType() == Void.TYPE.

Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte, причем в Java, в отличие от других языков, он не является беззнаковым. Типы float и double могут иметь специальные значения  ,   и «не число» (NaN). Для типа double они обозначаются Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN; для типа float — так же, но с приставкой Float вместо Double. Минимальные положительные значения, принимаемые типами float и double, тоже стандартизованы.

Тип

Длина (в байтах)

Диапазон или набор значений

boolean

1 в массивах, 4 в переменных[36]

true, false

byte

1

−128..127

char

2

0..216−1, или 0..65535

short

2

−215..215−1, или −32768..32767

int

4

−231..231−1, или −2147483648..2147483647

long

8

−263..263−1, или примерно −9.2·1018..9.2·1018

float

4

-(2-2−23)·2127..(2-2−23)·2127, или примерно −3.4·1038..3.4·1038, а также ,  , NaN

double

8

-(2-2−52)·21023..(2-2−52)·21023, или примерно −1.8·10308..1.8·10308, а также  ,  , NaN

Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java. Тем не менее одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые регистры или другими способами улучшают точность вычислений. Для того, чтобы сделать Java максимально совместимой между разными системами, в ранних версиях любые способы повышения точности вычислений были запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что ухудшение точности ради платформенной независимости мало кому нужно, тем более если за это приходится платить замедлением работы программ. После многочисленных протестов этот запрет отменили, но добавили ключевое слово strictfp, запрещающее повышение точности.