-1

Джава-11

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


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


В классе CatMutant создайте private переменную целочисленного типа Eyes и public метод addEye, который увеличивает переменную Eyes на единицу.


Создайте в основном классе экземпляр класса CatMutant с именем komuk и массив типа Cat размерностью два. Первому элементу массива создайте и присвойте экземпляр класса Cat, а второму komuk. Как вы можете видеть, компилятор позволил присвоить переменной суперкласса (Cats[1]) переменную подкласса (komuk). Эта способность переменной называется полиморфизмом - любая объектная переменная может ссылаться на переменную подкласса.


Теперь попробуйте вызвать Cats[1].addEye, компилятор выдаст ошибку, т.к. тип переменной Cats[1] – Cat и такого метода в классе не существует. Однако если вы вызовете метод punish, то второй элемент может восстановить ногу. Дело в том, что вместе с массивом хранятся тип каждого из элементов и при вызове метода компилятор выполняет следующие действия:


* компилятор проверяет тип элемента и имя метода. Затем ищет все доступные методы под именем метода в классе элемента и во всех его суперклассах.


* затем компилятор разрешает перегрузку методов – по типу передаваемых параметров выбирает метод, которому эти параметры подходят.


* если метод является конструктором или имеет модификатор private, static или final, то компилятору точно известно как вызвать метод (статическое связывание), иначе метод выбирается исходя из типа элемента (динамическое/позднее связывание).


* если используется динамическое связывание, то ищется метод класса, к которому принадлежит элемент. Если в классе такого метода нет, то метод ищется в суперклассе, если его нет в суперклассе, то виртуальная машина идёт вверх по иерархии пока не найдёт метод. Когда метод найден, он вызывается.


На примере Cats[1].getName. Во время вызова этого метода пытается найти метод getName в классе CatMutant, но не находя его обращается к суперклассу Cat. Откуда и выполняется метод.

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