Как стать автором
Обновить

Типы данных

Уровень сложностиПростой

Java — строго типизированный объектно-ориентированный язык программирования. Переменные и выражения имеют конкретный тип и каждый тип строго определен. Все операции присваивания проверяются на соответствия типов.

Примитивные типы

Целые числа

тип

размер (биты)

byte

8

short

16

int

32

long

64

Диапазон значений определяется по формуле

 [-2^{n-1};2^{n-1}-1]

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

Рисунок 1
Рисунок 1

Пример преобразования значения типа byte к значению из интервала допустимых значений данного типа

byte x=127;
System.out.println(++x);//-128

Числа с плавающей точкой

тип

размер (биты)

float

32

double

64

float f = 23.1f;
double d = 24.4;

Символы

тип

размер (биты)

char

16

Данный тип используется для хранения одиночного символа. Символы в java представлены в кодировке Unicode

char ch1 = 'a';//символ 'a'
char ch2 = 65;//соответствующий ASCII-коду 65 ('A')
char ch3 = '\u03A9';//соответствует символу 'Ω'

Логические значения

тип

размер (биты)

boolean

зависит от JVM

Диапазон значений: true, false

boolean a = true; 
boolean b = false;

Литералы

Литерал - это представление операнда с постоянным значением

Целочисленные

Основание

Конструкция

Допустимые обозначения

Пример

2

0bN или 0BN

0-1

0b1010, 0B101

8

0N

0-7

01, 02, 06

10

N

0-9

2, 32, 123

16

0xN или 0XN

0-9-A-F

0xAF, 0x23

N - число

Правила, применимые к целочисленным литералам

  • Целочисленный литерал указывается как тип int по умолчанию

  • Когда значение присваивается к типу byte, short или char, то ошибки не происходит, если значение находится в интервале допустимых значений данного типа

  • Для применения к типу long необходимо указать обозначение L или l (0x7L, 20L, 07L)

  • Для разделения литералов используется знак подчеркивания ( int x=123_456_789; )

С плавающей точкой

Форма

По основанию 10

По основанию 16

Стандартная

2.0, 3.14

~

Экспоненциальная

10.0E0 или 8250e-2

0xA.0p0 или 0XA5p-1

Правила, применимые к литералам с плавающей точкой

  • По умолчанию литерал имеет тип double, а также можно указать и явно, добавив d или D ( double x=3.14D )

  • Чтобы обозначить тип float, то нужно добавить f или F ( float x=3.14f )

  • Для разделения литералов используется знак подчеркивания ( double d=0XA_5p-1 или 1_2_3.1_2_3)

  • Литералы с экспоненциальной формой записи после p содержит степень числа два, на которое умножается заданное число. ( 0x0.Ap1 (16) = 0.625*2 )

Логические

Тип boolean может иметь только два значения: true, false

Символьные

Символы в Java - это символы из набора символов Юникод. Могут быть преобразованы в целые значения над которыми можно производить целочисленные операции.

Управляющая последовательность - это способ задания символа, который является специфичным или выходит за пределы ASC2

char s1 = 'A';char s2 = 'g';

Символьные литералы помещаются в одинарные кавычки. Символы указываются из кодировки ASC2

char s1 = '\'';char s2 = '\n';

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

char s1 = '\141';char s2 = '\u1212';

Так как количество символов в Unicode больше чем в ASC2, то для их указания используется числовой код как в восьмеричной форме, так и в шестнадцатеричной. (\ddd - восьмеричный, \uxxxx - шестнадцатеричный)

Управляющие последовательности

\ddd

восьмеричный символ

\uxxxx

шестнадцатеричный символ

\'

одинарная кавычка

\\

обратная косая черта

\r

возврат каретки

\n

новая строка

\f

подача страницы

\t

табуляция

\b

возврат на одну позицию

String s = "Hello World\b";
System.out.println(s);//Hello Worl

System.out.println("Страница 1");
System.out.println("\f");
System.out.println("Страница 2");

System.out.println("\\Hello\\");// \Hello\

System.out.println('\u8511');//蔑

Строковые

Строковые литералы помещаются в двойные кавычки

String str="asd asd asd";
String str="\111 asd asd asd";//I asd asd asd

Управляющие последовательности в строковых литералах имеют аналогичное поведение, что и в символьных литералах

Переменные

Форма объявления переменной: type name [=value] [, name [=value] ... ]

name - это имя переменной, value - значение, type - обозначает один из примитивных типов, класс или интерфейс

int a = 3, b, c = 6;
byte z, d;
char x = 'x';

Идентификатор - это последовательность символов для именования классов, методов и переменных

Правила наименования переменных

  • Не должны начинаться с цифры

  • Учитывается регистр

  • Строчные и прописные буквы, цифры, знаки подчеркивания, $

  • Возможны символы из кириллицы и других кодировок, но не рекомендуется

Преобразование типов

Автоматическое

Условия автоматического преобразования типов

  • Оба типа совместимы

  • Длина целевого типа больше длины исходного типа

При выполнении данных условий выполняется расширяющее преобразование (рисунок 2)

Рисунок 2
Рисунок 2

Преобразования типов данных

boolean

byte

short

char

int

long

float

double

boolean

~

n

n

n

n

n

n

n

byte

n

~

y

c

y

y

y

y

short

n

c

~

c

y

y

y

y

char

n

c

c

~

y

y

y

y

int

n

c

c

c

~

y

y*

y

long

n

c

c

c

c

~

y*

y*

float

n

c

c

c

c

c

~

y

double

n

c

c

c

c

c

c

~

N - нельзя преобразовать; Y - автоматическое расширяющее преобразование; Y* - автоматическое расширяющее преобразование с потерей точности; C - сужающее преобразование

Явное

Приведение типов - это явное преобразование типов

Форма: (type) value, где type - целевой тип, value - значение, которое требуется преобразовать

Виды преобразований

  • Сужающее преобразование. Это обратный процесс к преобразованию расширения. Например преобразование int к byte не может быть выполнено автоматически так как не выполнены условия автоматического преобразования. А именно длина целевого типа меньше исходного, но по условиям требуется чтобы длина была больше

  • Усечение. Это преобразование числа с плавающей точкой к целочисленному значению. Как правило при таком преобразовании отбрасывается дробная часть. После чего происходит сужающее преобразование или присвоение значения к целевому типу

int a = 474;
byte b = (byte) a;

Пример сужающего преобразования

float a = 474.323f;
byte b = (byte) a;

Пример усечения

Продвижение типов

byte b=50;
b=b*2;//java: incompatible types: possible lossy conversion from int to byte

В данном случае мы видим ошибку несовместимости типов, так как выражение b*2 является типом int. И автоматическое преобразование не работает так как целевой тип меньше чем исходный. (byte меньше чем int). В таком случае требуется явное приведение типов.

Правила продвижения типов

  • Сначала значения типа byte, short, char продвигаются к типу int

  • Затем к типу long, если есть операнд такого типа

  • Затем к типу float, если есть операнд такого типа

  • Затем к типу double, если есть операнд такого типа

int x=999_999_999;
int y=999_999_999;
long r=x*y;//808348673

Так как выражение продвигается к int, но диапазона не хватает, то производится операция по модулю для типа int. Чтобы исправить данную ситуацию, то надо один из типов привести к типу long

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.