Хранят адрес объекта в памяти, на который ссылаются (отсюда и название).
Используются для доступа к объектам (его нельзя получить, если на объект нет ссылки)
Создаются присваиванием значения
Создаются через конструкторы классов (присваивание только создаёт вторую ссылку на существующий объект)
Имеют строго заданный диапазон допустимых значений
По умолчанию их значение — null
В аргументы методов попадают копии значения переменной (это передача по значению)
В методы передаётся значение ссылки — операция выполняется над оригинальным объектом, на который ссылается переменная
Могут использоваться для ссылки на любой объект объявленного или совместимого типа
Хотя у примитивов и ссылок много общего, между ними есть существенные различия. И главное различие — в том, что именно в них хранится.
Вот пример использования примитивных и ссылочных типов данных:
int a = 5;
int b = a; //мы создали две переменных и два различных значения, которые содержат число 5
Cat barsik = new Cat(); //мы создали объект Cat, и переменной barsik присвоена ссылка на этот объект
Cat murka = barsik; //создали две ссылки на один и тот же объект Cat
в зависимости от типа данных у каждой переменной есть значение по умолчанию. Оно присваивается при её создании.
В этом примере значения по умолчанию получат все переменные:
private int a;
private double b;
private String text;
А в этом примере значения получают только переменные класса: когда мы создадим класс Cat, по умолчанию weight будет равен 0.0.
public class Cat {
private double weight;
public void setWeight(double weight) {
this.weight = weight;
}
public double getWeight() {
return weight;
}
}
Но локальные переменные нужно инициировать сразу при создании. Если написать просто int sum; , компилятор выдаст ошибку: java: variable a might not have been initialized.
private static int sum(int[] prices) {
int sum = 0;
for (int price : prices) {
sum += price;
}
return sum;
}
У примитивов есть строгие рамки допустимых значений по умолчанию и диапазоны значений — для удобства мы собрали их в таблицу.
Целочисленные типы данных различаются только диапазонами значений. Их основная задача — хранить информацию для вычислений.
Типbyte. Эти переменные используют, чтобы работать с потоком данных, который получили из файла или по сети.
//объявляем переменные с типом данных byte
byte a;
byte b;
byte c;
//инициализируем переменные значениями
a = 0;
b = 0;
c = -129; //это пример ошибки во вводе данных. Такое значение не входит в диапазон значений byte
//выводим данные из переменных
System.out.println(a);
System.out.println(b);
Типshort. По сравнению с byte у него увеличенный, но всё же ограниченный диапазон значений. Применяют short редко — например, когда нужно экономить память.
//инициализируем переменную типа short
short primerShort = 255;
Типint. В языке Java int — самый популярный тип целочисленных данных. При вычислениях в виртуальной машине остальные целочисленные типы (byte, short) занимают столько же памяти, сколько int.
//инициализируем переменную типа int
int closeToMiddle = 0;
Множество классов в Java обладают значениями типа int — например, длина массива внутри класса String выражается целочисленным значением int:
String[] strings = new String[50];
int arrayLength = strings.length;
Если переменная хранит количество элементов в коллекциях List, Set и Map, она тоже относится к типу int:
List strings = new ArrayList<>();
int listSize = strings.size();
Тип возвращаемого значения подсказывает, сколько элементов можно хранить в списке или множестве. Максимум для int — 2 147 483 647.
Типlong применяют, когда нужно работать с большими целочисленными значениями.
//инициализируем переменные типа long
long c = -9223372036854; //при компиляции появится ошибка
long right = -9223372036854L;
По умолчанию компилятор воспринимает целое число как int, а 9 223 372 036 854 намного больше его максимального значения, поэтому в коде программы нужно явно указать тип long.
Тип данных double используют для работы с десятичными числами.
//инициализируем переменную типа double
double sample = 59.36;
Тип float используют как экономичный вариант хранения больших массивов данных с плавающей точкой.
Когда переменной присваивают тип float, язык Java воспринимает её как тип данных double. Чтобы этого не происходило, нужно добавлять в конце переменной символ f или F.
Даже если у переменных float и double будут одинаковые значения, язык Java обработает их по-разному, поэтому они будут занимать разный объём памяти.
//инициализация переменных типа float
float f = 1.457; //Java воспримет эту переменную как тип данных double и выдаст ошибку компиляции
float floatNumber = 27.5f; //правильный способ
float otherFloat = (float) 78.64; //другой вариант инициализации переменной типа float во избежание путаницы с double
Не стоит использовать float, когда в вычислениях нужна точность больше пяти знаков после запятой.
Чтобы работать с логическими значениями, используют тип данных boolean — это его единственное применение. У такой переменной может быть только два значения: false (ложь) и true (истина).
//инициализируем переменные типа boolean
boolean isWorking = true;
boolean isAlive = false;
В Java boolean — отдельная переменная. Это не аналог 1 или 0, как, например, в JavaScript и PHP.
Тип данных char используют, чтобы хранить в переменных любые 16-разрядные символы Unicode. Но их нужно записывать строго в одинарные кавычки ' ', и только по одному.
Тестовые вопросы:
Какой тип данных в Java используется для хранения целых чисел без дробной части?
a) float
b) double
c) int
d) long
e) byte
Ответ: c) int
Какой тип данных в Java используется для хранения чисел с плавающей точкой двойной точности?
a) float
b) double
c) int
d) long
e) byte
Ответ: b) double
Какой тип данных в Java используется для хранения символов?
a) char
b) string
c) int
d) double
e) long
Ответ: a) char
Какой тип данных в Java используется для хранения логических значений?
a) bool
b) boolean
c) bit
d) byte
e) char
Ответ: b) boolean
Какой тип данных в Java используется для хранения коротких целых чисел?
a) int
b) short
c) long
d) byte
e) float
Ответ: b) short