Найти тему

Примитивные типы данных

Язык программирования Java имеет статическую типизацию, что означает, что все переменные должны быть сначала объявлены, прежде чем их можно будет использовать. Это включает указание типа и имени переменной, как вы уже видели:

int gear = 1;

При этом ваша программа узнает, что существует поле с именем "gear", содержит числовые данные (целое число) и имеет начальное значение 1. Тип данных переменной определяет значения, которые она может содержать, а также операции, которые могут быть выполнены с ней. В дополнение к int, язык программирования Java поддерживает семь других примитивных типов данных. Примитивный тип предопределен языком и называется зарезервированным ключевым словом. Язык программирования Java поддерживает восемь примитивных типов данных:

  • byte. Тип данных представляет собой 8-разрядное целое число, дополняющее двойку со знаком. Его минимальное значение равно -128, а максимальное - 127 (включительно). byteТип данных может быть полезен для экономии памяти в больших массивах, где экономия памяти действительно имеет значение. Их также можно использовать вместо int там, где их ограничения помогают прояснить ваш код; тот факт, что диапазон переменной ограничен, может служить формой документации.
  • short. Тип данных представляет собой 16-разрядное целое число, дополняющее двойку со знаком. Минимальное значение -32 768, а максимальное - 32 767 (включительно). Как и в случае с byte, применяются те же рекомендации: вы можете использовать short для экономии памяти в больших массивах в ситуациях, когда экономия памяти действительно важна.
  • int. По умолчанию int тип данных представляет собой 32-разрядное целое число со знаком, дополняющее два, которое имеет минимальное значение -231 и максимальное значение 231 -1. В Java SE 8 и более поздних версиях вы можете использовать int тип данных для представления 32-разрядного целого числа без знака, которое имеет минимальное значение 0 и максимальное значение 232-1. Используйте класс Integer для использования int типа данных как целого числа без знака. Смотрите раздел Классы чисел для получения дополнительной информации. В compareUnsigned класс были добавлены статические методы, такие как divideUnsigned, Integer и т.д. Для поддержки арифметических операций с целыми числами без знака.
  • long. Тип данных представляет собой 64-разрядное целое число с дополнением к двум. Значение long со знаком имеет минимальное значение -263, а максимальное значение - 263 -1. В Java SE 8 и более поздних версиях вы можете использовать long тип данных для представления 64-разрядных данных без знака, которые имеют минимальное значение 0 и максимальное значение 264-1. Используйте этот тип данных, когда вам нужен диапазон значений, более широкий, чем те, которые предоставлены int. Long Класс также содержит такие методы, как compareUnsigned, divideUnsigned и т.д. Для поддержки арифметических операций для unsigned long .
  • float: Тип данных представляет собой 32-разрядный формат с плавающей запятой IEEE 754 одинарной точности. Диапазон их значений выходит за рамки данного обсуждения, но указан в разделе Типы, форматы и значения с плавающей запятой спецификации языка Java. Как и в случае с рекомендациями для byte и short, используйте float (вместо double), если вам нужно сэкономить память в больших массивах чисел с плавающей запятой. Этот тип данных никогда не следует использовать для точных значений, таких как валюта. Для этого вам нужно будет вместо этого использовать класс java.math.BigDecimal . Numbers and Strings охватывает BigDecimal и другие полезные классы, предоставляемые платформой Java.
  • double. Тип данных представляет собой 64-разрядный стандарт IEEE 754 с плавающей запятой двойной точности. Диапазон их значений выходит за рамки данного обсуждения, но указан в разделе Типы, форматы и значения с плавающей запятой спецификации языка Java. Для десятичных значений этот тип данных обычно используется по умолчанию. Как упоминалось выше, этот тип данных никогда не следует использовать для точных значений, таких как валюта.
  • boolean. Тип данных имеет только два возможных значения: true и false. Используйте этот тип данных для простых флагов, которые отслеживают условия true / false. Этот тип данных представляет один бит информации, но его "размер" не является чем-то точно определенным.
  • char. Тип данных представляет собой один 16-разрядный символ Юникода. Минимальное значение этого параметра равно '\u0000' (или 0), а максимальное - '\uffff' (или 65 535 включительно).

В дополнение к восьми примитивным типам данных, перечисленным выше, язык программирования Java также предоставляет специальную поддержку символьных строк через класс java.lang.String. Заключение вашей символьной строки в двойные кавычки автоматически создаст новый String объект; например, String s = "this is a string";. String объекты неизменяемы, что означает, что после создания их значения изменить невозможно. String Класс технически не является примитивным типом данных, но, учитывая особую поддержку, предоставляемую ему языком, вы, вероятно, будете склонны думать о нем как о таковом. Вы узнаете больше об String классе в разделе Простые объекты данных

Значения по умолчанию

Не всегда необходимо присваивать значение при объявлении поля. Полям, которые объявлены, но не инициализированы, компилятор устанавливает разумные значения по умолчанию. Вообще говоря, это значение по умолчанию будет равно нулю или null, в зависимости от типа данных. Однако полагаться на такие значения по умолчанию обычно считается плохим стилем программирования.

На следующей диаграмме приведены значения по умолчанию для вышеуказанных типов данных.

Тип данныхЗначение по умолчанию (для полей)байт0краткое описание0int0длинный0Lfloat0.0fдвойной0.0dсимвол'\u0000'Строка (или любой объект)nullлогическое значениеfalse

Локальные переменные немного отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Если вы не можете инициализировать локальную переменную там, где она объявлена, обязательно присвоите ей значение, прежде чем пытаться ее использовать. Доступ к неинициализированной локальной переменной приведет к ошибке во время компиляции.

Литералы

Возможно, вы заметили, что ключевое слово new не используется при инициализации переменной примитивного типа. Примитивные типы - это специальные типы данных, встроенные в язык; они не являются объектами, созданными из класса. Литерал - это представление фиксированного значения в исходном коде; литералы представлены непосредственно в вашем коде, не требуя вычислений. Как показано ниже, переменной примитивного типа можно присвоить литерал:

boolean = true;
char capitalC = 'C';
byte b = 100;
short s = 10000;
int i = 100000;

Целочисленные литералы

Целочисленный литерал имеет тип long, если он заканчивается буквой L или l; в противном случае он имеет тип int. Рекомендуется использовать заглавную букву, L поскольку строчную букву l трудно отличить от цифры 1.

Значения целых типов byte, short, int и long могут быть созданы из int литералов. Значения типа, long превышающие диапазон int, могут быть созданы из long литералов. Целочисленные литералы могут быть выражены этими системами счисления:

  • Десятичная система счисления: основание 10, цифры которого состоят из чисел от 0 до 9; это система счисления, которой вы пользуетесь каждый день
  • Шестнадцатеричный: основание 16, цифры которого состоят из чисел от 0 до 9 и букв от A до F.
  • Двоичный код: база 2, цифры которой состоят из чисел 0 и 1 (вы можете создавать двоичные литералы в Java SE 7 и более поздних версиях)

Для программирования общего назначения десятичная система счисления, вероятно, будет единственной системой счисления, которую вы когда-либо будете использовать. Однако, если вам нужно использовать другую систему счисления, следующий пример показывает правильный синтаксис. Префикс 0x указывает на шестнадцатеричный , а 0b - на двоичный:

// Число 26 в десятичной системе счисления
int decVal = 26;
// Число 26 в шестнадцатеричной системе счисления
int hexVal = 0x1a;
// Число 26 в двоичном формате
int binVal = 0b11010;

Литералы с плавающей запятой

Литерал с плавающей запятой имеет тип, float если он заканчивается буквой F или f; в противном случае его тип - double и он может необязательно заканчиваться буквой D или d.

Типы с плавающей запятой (float и double) также могут быть выражены с помощью E или e (для научных обозначений), F или f (32-разрядный литерал с плавающей запятой) и D или d (64-разрядный двойной литерал; это значение по умолчанию и по соглашению опущено).

double d1 = 123,4;
// то же значение, что и d1, но в научной записи
double d2 = 1.234e2;
float f1 = 123,4f;

Символьные и строковые литералы

Литералы типов char и String могут содержать любые символы Unicode (UTF-16). Если это позволяют ваш редактор и файловая система, вы можете использовать такие символы непосредственно в своем коде. Если нет, вы можете использовать "экранирование в Юникоде", такое как '\u0108' (заглавная C со сгибанием по окружности) или "S\u00ED Se\u00F1or" (Sí Señor по-испански). Всегда используйте "одинарные кавычки" для char литералов и "двойные кавычки" для String литералов. Управляющие последовательности Unicode могут использоваться в других частях программы (например, в именах полей), а не только в литералах char или String.

Язык программирования Java также поддерживает несколько специальных управляющих последовательностей для char и String литералов: \b (пробел), \t (табуляция), \n (перевод строки), \f (перевод формы), \r (возврат каретки), \" (двойная кавычка), \' (одинарная кавычка) и \\ (обратная косая черта).

Также существует специальный null литерал, который может использоваться в качестве значения для любого ссылочного типа. null может быть присвоен любой переменной, за исключением переменных примитивных типов. С null значением мало что можно сделать, кроме проверки его наличия. Поэтому null часто используется в программах как маркер, указывающий на то, что какой-либо объект недоступен.

Наконец, существует также особый тип литерала, называемый литералом класса, формируемый путем взятия имени типа и добавления ".class"; например, String.class. Это относится к объекту (типа Class), который представляет сам тип.

Использование символов подчеркивания в числовых литералах

В Java SE 7 и более поздних версиях любое количество символов подчеркивания (_) может отображаться в любом месте между цифрами в числовом литерале. Эта функция позволяет, например. для разделения групп цифр в числовых литералах, что может улучшить читаемость вашего кода.

Например, если ваш код содержит числа, состоящие из многих цифр, вы можете использовать символ подчеркивания для разделения цифр группами по три, аналогично тому, как вы использовали бы знак препинания, такой как запятая или пробел, в качестве разделителя.

В следующем примере показаны другие способы использования символа подчеркивания в числовых литералах:

длинный номер кредитной карточки = 1234_5678_9012_3456L;
длинный номер социальной защиты = 999_99_9999L;
число с плавающей точкой pi = 3.14_15F;
длинные шестнадцатеричные байты = 0xFF_EC_DE_5E;
длинные шестнадцатеричные слова = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ff_ff_ffffl;
количество байтов = 0b0010_0101;
длинные байты = 0b11010010_01101001_10010100_10010010;

Вы можете расставлять подчеркивания только между цифрами; вы не можете расставлять подчеркивания в следующих местах:

  • В начале или конце числа
  • Рядом с десятичной точкой в литерале с плавающей запятой
  • Перед суффиксом F или L
  • В позициях, где ожидается строка цифр

Следующие примеры демонстрируют допустимые и недопустимые места подчеркивания (которые выделены) в числовых литералах:

// Недопустимо: нельзя ставить символы подчеркивания
//
рядом с десятичной точкой
число с плавающей запятой pi1 = 3_.1415F;
//
Недопустимо: нельзя ставить символы подчеркивания
//
рядом с десятичной точкой
число с плавающей запятой pi2 = 3._1415F;
//
Недопустимо: невозможно поставить символы подчеркивания
//
перед суффиксом L
длинный socialSecurityNumber1 = 999_99_9999_L;

// OK (десятичный литерал)
int x1 = 5_2;
//
Недопустимо: невозможно поставить символы подчеркивания
//
В конце литерала
int x2 = 52_;
// OK (десятичный литерал)
int x3 = 5_______2;

//
Недопустимо: невозможно поставить символы подчеркивания
//
в исходном префиксе 0x
int x4 = 0_x52;
//
Недопустимо: нельзя ставить символы подчеркивания
//
в начале числа
int x5 = 0x_52;
// OK (шестнадцатеричный литерал)
int x6 = 0x5_2;
//
Недопустимо: невозможно поставить символы подчеркивания
//
в конце числа
int x7 = 0x52_;