При работе с объектами в 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; }
Этот код будет