Топ-100Ссылочные типы и типы значений в Java
LogoCodOrbits

Раздел: ООП

Здесь вы познакомитесь с объектно-ориентированным программированием в Java: классы, наследование, инкапсуляция и полиморфизм и многое другое.

Все разделы
Иконка ООП

Ссылочные типы и типы значений в 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
мин.

Similar Articles Icon
Divider

Аннотации в Java

12
мин.

Similar Articles Icon
Divider

Обработка исключений

10
мин.

Similar Articles Icon