Ссылочные типы и типы значений в Java
Last updated: 4 мая 2025 г.В Java есть два типа данных – ссылочные типы
и типы значений
.
int, char ,float и т.д это типы значений. Это простые типы. Это просто число либо символ, либо дробное число и т.д. Это не классы (ссылочные типы), которые могут состоять из многих полей типов значений:
1public class SomeClass {
2 int num;
3 char letter;
4 float floatingNum;
5}
То есть классы могут содержать простые типы типа int,char,float. То есть они сложны так как классы состоят из простых типов значений или также могут содержать в себе другие сложные типы.
Так вот почему же классы ссылочные, а типы значений нет?
Дело в том, что когда мы создаем объект на основе класса с помощью слова new, то в памяти выделяется под него участок и там хранятся значения полей этого объекта.
То есть созданный объект имеет свое состояние в этой области памяти и на эту область памяти можно ссылаться. Можно сказать, что объект это и есть эта область памяти, поэтому можно говорить, что происходит ссылка на объект.
Типы значений же это простые типы они хранят само значение в себе, а не ссылку на участок памяти в котором храниться много разных значений.
Подробнее о ссылках описано в примере далее.
1class SomeClass {
2 int num;
3 char letter;
4 double floatingNum;
5
6 SomeClass(int num, char letter, double floatingNum) {
7 // Не по теме данного урока! Но это важно знать.
8 this.num = num; // this это ссылка на текущий объект класса.
9 // this на русском это ЭТОТ. То есть ссылка на ЭТОТ
10 // объект класса. То есть если например мы создаем объект
11 // на основе класса SomeClass, то в конструкторе
12 // используется поле num именно ЭТОГО объекта, имеется
13 // ввиду именно того, который мы создаем.
14 // Обычно this используется чтобы не происходило
15 // путаницы с параметрами, так как, как видим, поля класса
16 // и параметры имеют одинаковые имена.
17 // То есть присваиваем полю num объекта класса SomeClass,
18 // значение параметра num переданного в конструктор.
19 this.letter = letter;
20 this.floatingNum = floatingNum;
21 // можно было бы переименовать поля класса или параметры
22 // тогда можно было бы обойтись без this. Но так лучше
23 // так как не нужно придумывать разные имена для полей класса
24 // и параметров.
25 }
26}
27
28public class Types {
29 public static void main(String[] args) {
30 // Продемонстрируем пример, чтобы понять что значит ссылаться.
31
32 // Создаем два объекта класса SomeClass
33 // Под каждый объект с помощью new
34 // выделяется отдельный участок памяти,
35 // в котором будет храниться его текущее состояние,
36 // то есть текущие значения его полей.
37 // То есть сейчас в одном участке памяти
38 // хранятся значения первого объекта 9, ‘f’, 1.45,
39 // в другом участке второго объекта 2, ‘k’, 6.11.
40 SomeClass someClass1 = new SomeClass(9, ‘f’, 1.45);
41 SomeClass someClass2 = new SomeClass(2, ‘k’, 6.11);
42
43 // someClass1 это имя, по которому мы можем
44 // обращаться к первому объекту, то есть к первому
45 // участку памяти, то есть someClass1 это ссылка на
46 // первый объект, а someClass2 это имя, по которому
47 // мы можем обращаться ко второму объекту,
48 // то есть ко второму участку памяти, то есть someClass2
49 // это ссылка на второй объект.
50
51 // Присваиваем первый объект второму.
52 someClass1 = someClass2;
53 // Что же произойдет? Большинство сразу подумает, что
54 // в участке памяти первого объекта просто поменяются
55 // значения полей, хранящиеся в нем, на те, которые
56 // находятся в участке памяти второго объекта.
57 // НО ЭТО НЕ ТАК. На самом деле имя, по которому
58 // можно было обращаться к первому объекту,
59 // просто перестанет ссылаться на свой участок памяти.
60 // То есть участок памяти первого объекта
61 // начнет ссылаться на участок памяти второго объекта.
62 // Теперь someClass1 и someClass2 — это
63 // один и тот же объект в памяти (второй объект).
64 // Просто манипулировать этим объектом в памяти
65 // теперь можно через разные имена.
66
67 // И если теперь мы, например, будем менять значение
68 // какого-то поля через имя someClass1:
69 someClass1.num = 10;
70 // К измененному полю мы также сможем
71 // обратиться через второе имя объекта.
72 System.out.println(someClass2.num); // увидим в консоли 10
73
74 // Поскольку мы изменили объект, у которого по сути есть
75 // два имени someClass1 и someClass2,
76 // имя не важно, мы можем через любое из них
77 // с ним работать.
78 // Думаю, теперь понятно, почему они ссылочные.
79 }
80}
Вывод:

Теперь то же самое только с типами значений.
1public class Types {
2 public static void main(String[] args) {
3 //Типы значений же это простые типы
4 //они хранят само значение в себе,
5 //а не ссылку на участок памяти.
6 //По аналогии с тем что сверху только с простыми типами.
7 int A=4, B=12;
8 A = B;
9 A = 6;
10 System.out.println(B);
11 //B все еще 12 в отличии от A, которая содержит 6
12 //так как сначала мы просто изменили значение в A
13 //на значение которое в B,
14 //а потом изменили значение в A на значение 6.
15 //На значение в B действия с A никак не влияют.
16 }
17}
Вывод:

Следующие уроки
Передача в метод ссылочных типов и типов значений
9
мин.
Аннотации в Java
12
мин.
Обработка исключений
10
мин.