1)Почему при необходимости изменить тип ссылочной переменной, необходима конструкция именно такого вида:
ParentClass parent = new ChildClass();
ChildClass child = (ChildClass) parent;
Почему нельзя изменить тип переменной, не создавая новую? : (ChildClass) parent
2)Насколько я понимаю из курса, ссылочная переменная хранит набор методов которые можно использовать. Почему нельзя изменить набор, не создавая новую переменную?
Хочу узнать подробнее, что происходит при изменении типа ссылочной переменной и в чем я ошибаюсь.
Скиньте пожалуйста ссылки на ресурсы, где можно почитать об этом подробно
Alexander Gromov
19 уровень
Почему при приведении ссылочных типов необходимо создавать новую ссылочную переменную?
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
29 марта 2021, 08:10
Двоякий вопрос.
Во-первых, в джаве строгая типизация.
Если мы объявили
int number = 45;
number не может и не должен быть ничем, кроме инта. Строгая типизация предотвращает огромное количество потенциальных ошибок, которые бы люди 100% допустили бы.
Поэтому если переменная создалась, в памяти указывается два поля, первое это тип ссылки, то есть какого типа объектов можно хранить, второе поле это значение переменной. Для примитивов это будет собственно значение, например для инта конкретные цифры.
Для ссылочных типов это будет ссылка на объект в памяти.
И никаким образом тип уже созданной переменной не поменяешь. Это очень удобно, иначе была бы вообще чехарда. Ты работаешь с переменной и понятия не имеешь чем она может являться в этом отрезке кода. Может это Студент. Может Слон. Может Словарь или Автомобиль. Я не могу себе даже представить как бы строилась бизнес логика в программах на 10 000 классов с такими приколами.
Второй момент, ты пишешь (ChildClass) parent, но чтобы привести тип, нам не нужно создавать переменную или менять.
Я не создаю переменную. Я не изменяю тип переменной.
Я просто делаю операцию приведения и использую нужный мне метод.
Также стоит напомнить, что приведение бывает явным и неявным, операция сужения делается при помощи явного приведения (твой пример) и такого в коде нужно избегать максимально и использовать только в тех случаях, если по другому никак.
Поскольку такие операции опасны рантайм эксепшенами, а рантайм ошибки это очень противный вид ошибок, поскольку чем позже обнаружен баг, тем дороже он обходится заказчику.
+5
Justinian Judge в Mega City One Master
29 марта 2021, 08:30
https://stackoverflow.com/questions/55758049/compile-time-or-runtime-for-type-casting-type-binding-type-inference-etc
- https://dev.to/njnareshjoshi/how-does-jvm-handle-polymorphism-method-overloading-and-overriding-internally-2m26
- https://stackoverflow.com/questions/43062344/how-does-dynamic-method-dispatching-work-in-java
Переменная сама по себе не хранит набор методов.
Набор методов хранит объект.
Переменная хранит ссылку на объект, который и хранит набор доступных методов.
Почитай:
- +1
Сергей Я Java Developer в DXC/Luxoft Expert
29 марта 2021, 06:53
это изучал?
0