До первого обращения к переменной ее надо объявить. При объявлении переменной указывают ее тип и имя. Это важно, потому что компилятор должен заранее знать, какой объем памяти выделить для хранения переменной, и как истолковывать данные, прочитанные из памяти.
Типы данных в языке Java можно разделить на две основные категории: примитивные (простые) и ссылочные . Они различаются по способу размещения данных в памяти.
Данные примитивного типа хранятся непосредственно в той ячейке памяти, которая ассоциирована с именем переменной. Обращаясь к переменной по имени, мы тем самым, обращаемся к данным в памяти. Если вы сравниваете две переменных, то сравниваются данные , которые с ними связаны. Если вы присваиваете одной переменной примитивного типа значение другой переменной примитивного типа, то происходит копирование данных .
В случае использования ссылочного типа в ячейке памяти, которая ассоциирована с именем переменной, хранится адрес данных, т.е. ссылка на данные, а не сами данные.
Необходимость в ссылочном типе данных можно продемонстрировать с помощью простого примера. Допустим, вы объявили строковую переменную с начальным значением «Java». Под это значение выделяется место в памяти. В процессе работы программы этой переменной присваивается новое значение «Hello, World!». Очевидно, что это совершенно другой объем данных, который не поместится в ранее отведенном фрагменте памяти.
Иными словами, ссылочные типы предназначены для работы с динамически создаваемыми и уничтожаемыми сущностями, объем которых невозможно предсказать заранее.
В таком случае программа размещает новые данные в другом фрагменте памяти. Новый адрес этих данных записывается в ячейку, которая ассоциирована с переменной ссылочного типа. Если на старые данные больше не ссылается ни одна переменная, то они превращаются в мусор (garbage) и удаляются из памяти при помощи специального сборщика мусора (garbage collector). В языке Java сборка мусора выполняется автоматически.
При проверке ссылочных переменных на равенство сравниваются не сами данные, а их адреса , хранящиеся в ссылочных переменных. Если вы присваиваете одной ссылочной переменной значение другой ссылочной переменной, при этом копируется адрес данных, а не сами данные.
3.1.1 Примитивные типы данных
В языке Java заявлено восемь примитивных типов данных. Первые четыре используются для хранения целых чисел.
byte – однобайтное целое – предназначен для хранения целых чисел в диапазоне от -128 до 127 и занимает один байт в памяти.
short – короткое целое – занимает два байта в памяти и применяется для хранения чисел в диапазоне от -32768 до32767.
int – целое – занимает 4 байта в памяти и применяется для хранения чисел в диапазоне от -2 31 (-2147483648) до 2 31—1 (2147483647). Это стандартный тип данных для работы с целыми числами.
При работе с числовыми данными старайтесь использовать тип int. Это связано с особенностями автоматического приведения типов, а также с тем, что целочисленные литералы (например, 10 или 123) в коде программы обрабатываются компилятором, как тип int. Приведение типов мы обсудим далее в этой главе.
long – длинное целое – занимает 8 байтов в памяти и хранит числа в диапазоне от -2 63 до 2 63—1. На практике настолько большие числа встречаются редко. Чтобы определить длинное целое число, следует добавить суффикс «L» в конце, например 5201225834L.
В дополнение к целочисленным типам, имеется два типа данных для хранения чисел с плавающей точкой.
float – с плавающей точкой – занимает 4 байта в памяти и может хранить числа в диапазоне от -3,4×10 38 до 3,4×10 38 с дискретностью 3,4×10 —38. Такая точность представления соответствует 7 знакам после запятой. Если вы попытаетесь сохранить в типе float число 1,234567891 (10 знаков), оно будет округлено до 1,234568 (7 знаков).
Что такое дискретность? Вы не можете задать значение типа float с произвольной точностью. Ведь количество байт памяти для хранения этого числа ограничено. Если мы начнем перечислять подряд, начиная с ноля, числа с плавающей точкой, то они будут следовать с некоторым шагом (дискретностью) в младших разрядах: 0; 3,4×10 —38; 6,8×10 —38 и т. д. Величину дискретности можно условно назвать погрешностью представления числа. Для достижения более высокой точности применяется тип double.
double – с плавающей точкой, двойной точности – занимает 8 байтов в памяти и может хранить числа в диапазоне от -1,7×10 308 до 1,7×10 308 с дискретностью 1,7×10 —308. Если вы не скованы ограничениями объема памяти, используйте тип double вместо float, как более точный.
Читать дальше