-1

Джава-12

Привет. Напоминаю в рамках тега изучениеджава (хейтерам банить именно его) я вместе с вами изучаю основы джава. Внезапно интернет у меня стал по карточкам (да-да, мамка наказала). Поэтому периодичность постинга будет завязана на великих шнурках рандома. Продлится это максимум до сентября. Прошу прощения за неудобства. Сегодня узнаем о предотвращении наследования и приведении типов.


В прошлом посте упоминалось динамическое связывание (иногда называемое поздним), суть которого заключается в выборе метода по фактическому типу объекта. Так метод punish для kotuk объявленного как Cat, вызывался из подкласса CatMutant.


Добавим в класс Cat метод, возвращающий имя. Навряд ли при наследовании его придётся каким-либо образом менять. Но вдруг мы забудем, что такой метод существует в суперклассе, и случайно его переопределим (при этом забыв какую-нибудь ключевую деталь), чего нам очень не хочется? Для предотвращения данной ситуации можно использовать ключевое слово final, тогда можно быть уверенным, что метод getName будет работать одинаково в любом случае.


Методы и классы с ключевым словом final называются конечными.


Как стало понятно тоже можно сделать и с классом. Например, класс String является конечным, и, используя один из методов класса String, мы ссылаемся именно на символьную строку. В противном случае можно было бы наследовать класс String (пусть будет подкласс Chars), переопределить метод N, объявить переменную типа String, присвоить ей экземпляр класса Char и в будущем не понимать, почему метод N работает не так, как с другими объектами класса String (вспомните про динамическое связывание).


Теперь о приведение типов. Приведением типов называется процесс принудительного преобразования из одного типа в другой. Вот код, который написал джек:

Джава-12 Java, Изучениеджава, Программирование

В первых трех строках кода красным выделено имя переменной типа CatMutant, чёрным тип переменной. В первой строке мы присваиваем переменной типа Cat переменную типа CatMutant. Компилятор позволяет нам это сделать, однако запоминает фактический тип переменной. Мы какбы говорим компилятору, ты используй эту переменную, но не обращай внимания на его дополнительные возможности.

Однако, он не позволит присвоить эту переменную (cat_CatMutant), переменной типа CatMutant – компилятор не обращает внимание на доп. возможности. Поэтому при компиляции возникнет ошибка (во второй строке).


Чтобы ошибки не возникало используется конструкция из третей строки. Указывая в скобках тип, к которому мы хотим привести переменную, мы говорим компилятору – помнишь я просил тебя забыть о дополнительных возможностях, нужно о них вспомнить.


Теперь обратимся ко вторым трём строкам. Вторая строка аналогично абзацу выше. Но третья строка хоть и скомпилируется при выполнении программы выдаст ошибку. Компилятор ответит нам – ты меня обманываешь, нельзя переменную (с реальным типом Cat) привести к CatMutant.


На этом всё, спасибо за внимание.

Дубликаты не найдены

+1

какое ужасное именование переменной - cat_CatMutant!!! зачем так???

стоит ещё упомянуть что перед тем как кастить нужно проверять с помощью instanceof тип переменной. так же стоит указать что ошибка будет времени исполнения, а не времени компиляции. а это не очень хорошо, т.к. отсрачивает момент нахождения проблем. не всегда можно избежать такого приведения типов, иногда получается, иногда нет.

раскрыть ветку 5
0
cat_CatMutant

для удобства

раскрыть ветку 4
0

и в чём удобство? оно нечитаемо от слова "Совсем"! имя должно отражать цель данного значения, а не его тип. по хорошему от типа надо абстрагироваться, а если его надо уточнить, всегда есть ИДЕ.

раскрыть ветку 3
Похожие посты
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: