При работе с объектами в Java важно понимать, как работают ссылочные переменные. В этом посте мы рассмотрим два распространенных сценария, в которых вы можете столкнуться с проблемами при назначении объектов ссылочным переменным.

Случай 1. Назначение объекта подкласса ссылочной переменной суперкласса

В этом случае у нас есть объект подкласса, присваиваемый ссылочной переменной суперкласса:

Object a = new String("java");

💡Действительна ли эта строка кода?💡

Ответ: да, эта строка кода действительна в Java.

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

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

Вариант 2. Назначение объекта суперкласса ссылочной переменной подкласса

В этом случае у нас есть объект суперкласса, присваиваемый ссылочной переменной подкласса:

Object a = new String("java");
String b = a;

💡Действительна ли эта строка кода?💡

Ответ — нет, эта строка кода недействительна в Java.

В этой строке ссылочной переменной типа String присваивается значение ссылочной переменной типа Object. Это не разрешено, потому что две ссылочные переменные имеют разные типы, и вы не можете присвоить значение одного типа переменной другого типа в Java без явного преобразования типа.

Чтобы сделать эту строку кода действительной, вам нужно привести значение a к String, прежде чем назначать его b. Вот как это сделать:

Object a = new String("java");
String b = (String) a;

Этот код присвоит значение a b как объекту String. Однако важно отметить, что этот тип приведения типов может быть рискованным, поскольку он может привести к ClassCastException, если приводимый объект на самом деле не является экземпляром целевого типа.

Чтобы избежать этого, рекомендуется использовать оператор instanceof для проверки типа объекта перед выполнением приведения.

Object a = new Object();
if (a instanceof String) {
  String b = (String) a;
}

Этот код будет