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

В Java есть два типа данныхссылочные типы и типы значений.

int, char ,float и т.д это типы значений. Это простые типы. Это просто число либо символ, либо дробное число и т.д.  Это не классы (ссылочные типы), которые могут состоять из многих полей типов значений:

public class SomeClass { int num; char letter; float floatingNum; }

То есть классы могут содержать простые типы типа int,char,float. То есть они сложны так как классы состоят из простых типов значений или также могут содержать в себе другие сложные типы.

Так вот почему же классы ссылочные, а типы значений нет?

Дело в том, что когда мы создаем объект на основе класса с помощью слова new, то в памяти выделяется под него участок и там хранятся значения полей этого объекта.

То есть созданный объект имеет свое состояние в этой области памяти и на эту область памяти можно ссылаться. Можно сказать, что объект это и есть эта область памяти, поэтому можно говорить, что происходит ссылка на объект.

Типы значений же это простые типы они хранят само значение в себе, а не ссылку на участок памяти в котором храниться много разных значений.

Подробнее о ссылках описано в примере далее.

class SomeClass { int num; char letter; double floatingNum; SomeClass(int num, char letter, double floatingNum) { // Не по теме данного урока! Но это важно знать. this.num = num; // this это ссылка на текущий объект класса. // this на русском это ЭТОТ. То есть ссылка на ЭТОТ // объект класса. То есть если например мы создаем объект // на основе класса SomeClass, то в конструкторе // используется поле num именно ЭТОГО объекта, имеется // ввиду именно того, который мы создаем. // Обычно this используется чтобы не происходило // путаницы с параметрами, так как, как видим, поля класса // и параметры имеют одинаковые имена. // То есть присваиваем полю num объекта класса SomeClass, // значение параметра num переданного в конструктор. this.letter = letter; this.floatingNum = floatingNum; // можно было бы переименовать поля класса или параметры // тогда можно было бы обойтись без this. Но так лучше // так как не нужно придумывать разные имена для полей класса // и параметров. } } public class Types { public static void main(String[] args) { // Продемонстрируем пример, чтобы понять что значит ссылаться. // Создаем два объекта класса SomeClass // Под каждый объект с помощью new // выделяется отдельный участок памяти, // в котором будет храниться его текущее состояние, // то есть текущие значения его полей. // То есть сейчас в одном участке памяти // хранятся значения первого объекта 9, ‘f’, 1.45, // в другом участке второго объекта 2, ‘k’, 6.11. SomeClass someClass1 = new SomeClass(9, ‘f’, 1.45); SomeClass someClass2 = new SomeClass(2, ‘k’, 6.11); // someClass1 это имя, по которому мы можем // обращаться к первому объекту, то есть к первому // участку памяти, то есть someClass1 это ссылка на // первый объект, а someClass2 это имя, по которому // мы можем обращаться ко второму объекту, // то есть ко второму участку памяти, то есть someClass2 // это ссылка на второй объект. // Присваиваем первый объект второму. someClass1 = someClass2; // Что же произойдет? Большинство сразу подумает, что // в участке памяти первого объекта просто поменяются // значения полей, хранящиеся в нем, на те, которые // находятся в участке памяти второго объекта. // НО ЭТО НЕ ТАК. На самом деле имя, по которому // можно было обращаться к первому объекту, // просто перестанет ссылаться на свой участок памяти. // То есть участок памяти первого объекта // начнет ссылаться на участок памяти второго объекта. // Теперь someClass1 и someClass2 — это // один и тот же объект в памяти (второй объект). // Просто манипулировать этим объектом в памяти // теперь можно через разные имена. // И если теперь мы, например, будем менять значение // какого-то поля через имя someClass1: someClass1.num = 10; // К измененному полю мы также сможем // обратиться через второе имя объекта. System.out.println(someClass2.num); // увидим в консоли 10 // Поскольку мы изменили объект, у которого по сути есть // два имени someClass1 и someClass2, // имя не важно, мы можем через любое из них // с ним работать. // Думаю, теперь понятно, почему они ссылочные. } }

Вывод:

Теперь то же самое только с типами значений.

public class Types { public static void main(String[] args) { //Типы значений же это простые типы //они хранят само значение в себе, //а не ссылку на участок памяти. //По аналогии с тем что сверху только с простыми типами. int A=4, B=12; A = B; A = 6; System.out.println(B); //B все еще 12 в отличии от A, которая содержит 6 //так как сначала мы просто изменили значение в A //на значение которое в B, //а потом изменили значение в A на значение 6. //На значение в B действия с A никак не влияют. } }

Вывод:

Передача в метод ссылочных типов и типов значений

Разбираем разницу между передачей в метод примитивов и объектов в Java. Почему объекты изменяются, а примитивы нет? Практические примеры.
Time to read: 9

Аннотации в Java

Узнайте, что такое аннотации в Java на примерах @Override, @Deprecated и @FunctionalInterface. Создавайте собственные аннотации с @interface для управления кодом.
Time to read: 12

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

Освойте обработку исключений в Java: try-catch-finally, throw и throws. Узнайте, как предотвратить аварийное завершение программы при ошибках.
Time to read: 10