Что такое переопределение методов.

Главная / Компьютеры / Что такое переопределение методов.

в Компьютеры 22.03.2020 0 66 Просмотров

Переопределение методов используется в объектно-ориентированном программировании в иерархии наследования и происходит, когда метод, определённый в суперклассе, переопределяется в подклассе. Обычно метод подкласса делает что-то отличное от метода суперкласса или расширяет возможности суперкласса, но это не должно иметь место. Переопределение методов происходит всякий раз, когда метод суперкласса переопределяется в подклассе, независимо от содержимого переопределенного метода. Переопределенные сигнатуры методов должны быть точно такими же.
Например, класс A может содержать метод с именем doSomething, и этот метод не принимает входных параметров. Кроме того, классы B и C могут быть подклассами класса A. Класс B может содержать метод с именем “doSomething”, который не принимает входные параметры, а класс C может содержать метод “doSomething”, который принимает число в качестве входного параметра.

В этом примере только класс B продемонстрировал бы переопределение метода, потому что его метод “doSomething” имеет ту же сигнатуру метода, что и его суперкласс, класс A. Метод “doSomething” в классе C, с другой стороны, демонстрирует перегрузку метода, потому что он создаёт совершенно новый метод.

Виртуальное наследование в C ++ является ещё одним примером переопределения методов. Виртуальные методы в суперклассах могут быть или не быть реализованы, но любое их определение подкласса является экземпляром переопределения методов. Когда метод переопределяется в подклассе, метод суперкласса не вызывается, если он не вызывается явно. Этот конкретный способ вызова переопределенного методов часто называют «скрывающим» реализацию суперкласса.

Хотя переопределение методов является очень гибким, не все методы могут быть переопределены, и бывают моменты, когда эта жёсткость может быть предпочтительнее. Как в Java, так и в C ++ конкретные сигнатуры могут применяться в сигнатурах методов, чтобы предотвратить переопределение методов в подклассе. Для этого Java использует «final», а C ++ использует ключевое слово «const». Предотвращение переопределения методов может быть полезным, если конкретная функция всегда должна оставаться неизменной по всему дереву наследования.

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

2020-03-22

Предыдущий: Что такое javabeans?

Следующий: Двоичное кодирование.

перевод и использование в разработке OTUS

Языки программирования часто базируются на английском. В разработке применяются иностранные слова для выполнения различных операций. Немало вопросов вызывает override.

Далее предстоит разобраться, как использовать соответствующий компонент в разработке программного обеспечения. Базовый язык программирования, взятый для примера – Java.

Перевод слова

С английского the override переводится на русский язык легко. Он in English имеет несколько значений:

  • отменять;
  • замещать;
  • обходить;
  • взламывать;
  • корректировка;
  • блокировка;
  • перегрузка.

С английского фраза «the manual override» будет переводиться на русский язык как «ручное управление», а «the override application settings» – как «переопределение настроек приложения». Именно такая интерпретация термина из всех приведенных будет использоваться при разработке программных продуктов.

Перегрузка и переопределение в Java

Переводчик указывает на то, что overrides application setting – это переопределение настройки в in the app (в приложении). В разработке ПО имеет смысл поговорить о перегрузке и переопределении.

Переопределение (overriding) многие путают с перегрузкой. Таблица ниже покажет, чем отличаются эти два компонента.

Переопределение метода (to override the method)Перегрузка метода
Методы должны обязательно обладать одинаковыми подписью и названиями.Названия у методов одинаковые, а подписи – разные.
Является примером полиморфизма времени исполнения (runtime).Полиморфизм времени компиляции.
Тип возврата методов всегда один и тот же.Типы возврата методов могут быть совершенно разными.
Переопределение (the overrides) происходит между несколькими классами.Перегрузка применима к одному и тому же классу.
Параметры у the overrides одинаковые.Параметры обязательно разные.

Все это поможет лучше и быстрее разобраться с тем, как и когда грамотно использовать the override a application settings в программировании информационных продуктов.

Аннотации Java

Стоит обратить внимание не только на то, как система переводит «overridden», а непосредственное применение соответствующего объекта. В программировании переопределение используется достаточно часто. в Java данный «термин» встречается в так называемых аннотациях. Далее предстоит познакомиться с ними поближе.

Аннотация – спецформа синтаксических метаданных. Добавляется в исходный код приложения, чтобы сделать его более функциональным, понятным и грамотным. Присваивается не только методам, но и другим кодовым элементам:

  • классам;
  • пакетам;
  • параметрам;
  • переменным.

Аннотация имеет простую форму представления – в виде специальных тегов. Записывается в Java как @Название_аннотации. Не имеет никакого отношения к функциональным элементам исходного кода.

Для чего использовать аннотации

The annotations of the app – это своеобразные помощники. Они не имеют функциональности, но помогают в следующих ситуациях:

  1. Предоставление сведений для компиляторов. При помощи аннотация удастся быстрее обнаруживать ошибки, подавлять различные предупреждения.
  2. Работа с данными разработчиков. В этом случае the annotations станут подсказками. Они сделают исходный код of the app более понятным и читабельным.
  3. Проведение обработки времени развертывания и компиляции.
  4. Обработка времени выполнения. Это особо важный момент при организации и прохождении тестов.

The override и другие аннотации в Java – это набор переопределенных объектов, но их можно создавать самостоятельно. Ниже представлены «стандартные» аннотации Джавы. Особое внимание будет уделено непосредственно override.

@SupsessWarnings

Если перевести название на русский, получится «подавление предупреждения». Данная аннотация используется для соответствующего действия. Она помогает избавиться от предупреждений – частично или полностью. Поддерживает возможность настройки лишь тех «сообщений», которые необходимо подавать.

В предложенном примере первая строчка будет скрывать предупреждения о непроверенных методах. За это отвечает unchecked. Если соответствующий параметр изменить на deprecated, будет происходить сокрытие предупреждений устаревших методов.

@Deprecated

The annotation, которая указывает на устаревание аннотируемого метода. Он больше не поддерживается разработчиками. Компилятор не будет обрабатывать такие методы иначе, чем обычные. Предугадать возвращаемый ответ проблематично.

@Author

Отвечает за документирования автора метода или всего документа. Отдельно использоваться может, но встречается это крайне редко. Обычно @author применяется с дополнительной информацией.

При работе в Oracle дополнительные теги, включая упомянутый, пишутся в следующем порядке:

  • документация автора;
  • версия;
  • описание свойств и параметров проекта;
  • «справка» о возвращаемом значении;
  • документация проверенных исключений со ссылкой или указанием на нее;
  • версия приложения, в которой добавлен новый функционал;
  • указание на то, что код перестал поддерживаться.

Имена the annotations будут соответственно: author, version, param, return, throws, see, since, deprecated.

Тест-аннотации

При изучении override и the annotations в Java стоит обратить внимание на тест-аннотации. Они бывают нескольких видов:

  1. @Test. Указывает, что method должен быть обработан как тест. Для его запуска будет создан новый экземпляр класса. Здесь используется непосредственный вызов тестового метода. Поддерживает несколько параметров – timeout и expected. Первый приведет к свою выбранного test method, если на его реализацию уходит более установленного времени в миллисекундах. Второй ссылается на то, что method должен выдавать исключение.
  2. @Ignore. Указывает на необходимость игнорирования теста или их группы. Потребуется для устранения потенциальных сбоев работы программного обеспечения.
  3. @Before. Все помеченные им the methods будут выполнять перед каждым тестом. Если использовать похожую аннотацию – @BeforeAll, удастся выполнить дорогостоящую операцию.
  4. @After. Это – аналог предыдущего варианта. Он проводит the override methods, которые выполняются до тестирования. Указывает на компоненты, которые необходимо активировать после начала теста. @afterAll и @afterClass применяются для всех tests класса.

Все перечисленные аннотации относятся непосредственно к тестам. Отдельно необходимо изучить the override settings в Java.

@override

Override используется для переопределения methods из суперкласса. Данная аннотация применяется только к методам и является своеобразным «маркером». Она указывает на то, что элемент подкласса переопределяет компонент родительского класса или суперкласса. Override – аннотация, которая не является обязательной. Ее использование помогает избежать возникновения разнообразных ошибок.

Метод, помеченный как override, будет устанавливать method суперкласса. Если в родительском классе или интерфейсе такой компонент не обнаружен, возникнет ошибка компиляции.

Пример использования

Вот – наглядный код, помогающий лучше разобраться в принципах работы override:

В нем наблюдается следующее:

  1. Имеются четыре класса: overrideJava, FirstClass, SecondClass, ThirdClass.
  2. Override Java – место, в котором располагается метод main(). В нем methods других классов будут вызываться путем использования объектов.
  3. FirstClass обладает элементом method1(). В нем содержится сообщение для печати внутри.
  4. SecondClass расширяет FirstClass через наследование. В нем применяется the annotation override.
  5. ThirdClass расширяет SecondClass. Он тоже использует method1() с аннотацией.
  6. Для проверки на факт того, какой method будет вызван, необходимо создать объект ThirdClass. Он станет дочерним классом. Далее предстоит вызвать method1.

После обработки кода будет понятно, что метод внутри ThirdClass вызывается. Связано это с тем, что дочерний компонент изменил свою внутреннюю реализацию после родителя.

Выглядит результат выполнения предложенного фрагмента так:

А вот еще один вариант реализации the override:

Этот код используется, если необходимо вызвать method1() родительского класса вместо дочернего. Тогда потребуется внедрить super. method1(). Он вызовет method1() своего суперкласса.

Выходные сведения покажут, что внутри ThirdClass сначала будет вызван его «родитель» (метод SecondClass), а затем – его собственная реализация.

Теперь понятно, какой имеет override перевод, а также как данный элемент применяется программистами при разработке программного обеспечения.

Сокрытие методов в Java — темы Scaler

Обзор

Java позволяет скрывать переменные в суперклассе методами в подклассах с тем же типом и сигнатурой. Программист может скрыть метод, пытаясь переопределить его, поскольку сокрытие метода и переопределение метода являются тесно связанными понятиями.

С помощью переопределений можно написать код, который выполняется по-разному в зависимости от состояния объекта во время выполнения. Функция может быть скрыта от суперкласса статическим методом с тем же именем в подклассе, потому что статический метод в Java не может быть переопределен.

Scope

  • В этой статье мы поговорим об определении скрытия метода в Java и факторах скрытия метода (MHF) .
  • Мы реализуем концепцию сокрытия методов в программе на Java.

Что скрывает метод?

  • Когда дочерний класс определяет статический метод с той же сигнатурой, что и статический метод родительского класса, дочерний метод скрывает метод родительского класса . Переопределение метода относится к такому же поведению с использованием методов экземпляра.
  • Скрытие метода аналогично переопределению метода с точки зрения функциональности. Переопределение позволяет вам вызывать методы на основе типа экземпляра, если вы создаете метод в подклассе с тем же типом и сигнатурой.
  • Если статические методы в суперклассе и подклассе имеют одинаковый тип и сигнатуру, метод в подклассе скрывает метод в суперклассе .
  • Статические методы не могут быть переопределены, поскольку переопределение методов основано на динамическом связывании во время выполнения, тогда как статические методы связываются посредством статического связывания во время компиляции. В результате мы не можем переопределить статические методы .
  • С другой стороны, родительский класс и его подклассы могут иметь статические методы с одинаковыми сигнатурами. Говорят, что статический метод в подклассе скрывает идентичный метод в родительском классе в этой ситуации.

Пример сокрытия метода в Java

Вывод:

В приведенном выше примере статический метод foo() в подклассе Child имеет то же имя и сигнатуру, что и статический метод в родительском родительском классе. Когда мы вызываем p.foo() и c.foo(), мы вызываем метод foo() в родительском классе.

В отличие от переопределения метода, где p.bar() вызывает метод родительского класса, а c.bar() вызывает метод дочернего класса.

Примечание: Суперкласс и подкласс должны иметь идентичные имена методов, типы возвращаемых значений и списки параметров. Мы не можем переопределить метод, который был обозначен как окончательный и статический .

Особенности сокрытия методов в Java

  1. Сокрытие методов такое же, как полиморфизм времени компиляции , поскольку разрешение метода обрабатывается компилятором в зависимости от типа ссылки.
  2. Его часто называют статическим полиморфизмом или ранним связыванием .
  3. При сокрытии метода компилятор Java всегда разрешает вызовы методов в зависимости от типа ссылки. В Java полиморфизм времени выполнения не играет никакой роли в сокрытии методов.
  4. Использование static в объявлениях методов должно быть согласованным между суперклассами и подклассами.

Коэффициенты сокрытия методов (MHF)

  • Факторы сокрытия методов используются для оценки невидимости методов в классах. процент от общего числа классов, из которых метод невидим, называется его невидимостью .
  • Если другой класс или объект может получить доступ к атрибуту, он считается видимым. Внутри класса атрибут должен быть скрыт. Их можно сделать закрытыми, чтобы другие объекты не могли получить к ним доступ.
  • Определяется добавлением невидимости каждого метода к другим классам в проекте. При расчете MHF мы берем , private = 1, public = 0 и protected = размер дерева наследования / количество классов . Таким образом, MHF — дробь.
  • Количество видимых методов отражает функциональность класса. MHF будет уменьшен за счет увеличения общей функциональности .
    • Низкий MHF предполагает, что реализация не была должным образом абстрагирована. Большой процент методов не защищен. Поэтому высок риск ошибки.
    • Высокий MHF указывает на отсутствие функциональности. Это также может означать, что дизайн содержит значительную часть специализированных методов, которые нельзя использовать повторно. Приемлемый диапазон MHF от 8% до 25% Было предложено . Это полностью зависит от вас, чтобы принять решение.
  • Коэффициент маскировки метода в идеале должен иметь высокое значение.
  • Для расчета MHF можно использовать следующую формулу:

Пример

Вывод:

В этом примере предполагается, что p.sleep() вызовет метод sleep() из родительского класса, а c.sleep() вызовет метод sleep() из дочернего класса, как и при переопределении, но поскольку sleep() — это статическая функция, мы скрыли метод sleep(), а не переопределили его.

Так как sleep() является статической функцией, скрытие метода будет выполнено, потому что метод, скрывающий функцию внутри класса Child, скрывает родительскую функцию, а функция c.sleep() вызывается при вызове p.sleep().

Поскольку статические методы разрешаются во время компиляции, как p.sleep(), так и c.sleep() разрешаются в метод sleep() класса Parent, поскольку переменные p и c относятся к типу Parent. Когда статическое ключевое слово удалено из обоих методов, поведение соответствует ожидаемому.

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

Метод скрытия против. Переопределение метода

Метод скрытия Переопределение метода
Оба метода должны быть статическими . Оба метода должны быть нестатическими .
Компилятор обрабатывает разрешение метода на основе ссылочного типа . JVM обрабатывает разрешение методов на основе объектов времени выполнения .
Характеризуется полиморфизмом времени компиляции , статический полиморфизм или раннее связывание. Характеризуется полиморфизмом времени выполнения , динамическим полиморфизмом или поздним связыванием.

Пример переопределения метода в java:

В этом примере и суперкласс, и подкласс имеют методы с одинаковой сигнатурой (имя метода и параметры), и когда мы пытаемся вызвать этот метод из подкласс, метод подкласса переопределяет метод в суперклассе и выполняется.

Если суперкласс и подкласс имеют одни и те же методы экземпляра, включая параметры, метод суперкласса переопределяется методом подкласса при вызове.

Пример сокрытия метода в Java:

Когда суперкласс и подкласс включают одни и те же методы, включая параметры, и если они являются статическими, и когда вызывается метод суперкласса, метод подкласса скрывает метод суперкласса .

Заключение

  1. Скрытие метода — «Если подкласс (дочерний класс) определяет статический метод с той же сигнатурой, что и статический метод в суперклассе (родительском классе), метод подкласса скрывает метод в суперклассе».
  2. Сокрытие метода происходит из-за того, что статические методы разрешаются во время компиляции .
  3. В концепции сокрытия метода вызов метода определяется ссылочным типом. Его также называют полиморфизмом времени компиляции .
  4. Переопределение метода происходит в Java, когда подкласс (дочерний класс) содержит тот же метод, что и родительский класс.

Переопределение метода в Java — PixelTrice

Переопределение метода в Java заключается в предоставлении другой логики методу в подклассе, который унаследован от суперкласса.

Это означает, что метод, представленный в суперклассе, также присутствует в подклассе или дочернем классе.

Но логика или реализация метода полностью отличается от логики метода в родительском или суперклассе.

Подробнее Если дать вам более техническое определение, то переопределение метода — это процесс предоставления конкретной реализации метода подкласса или определения метода для унаследованного метода.

Примечание. Переопределение метода возможно только в случае наследования.

Следовательно, обязательным условием переопределения любого метода является то, что метод с таким же именем должен присутствовать и в родительском классе.

  1. Переопределение метода в java помогает достичь полиморфизма во время выполнения.
  2. Это дает нам возможность использовать нашу собственную бизнес-логику или реализацию в зависимости от требований.

Чтобы понять приведенное выше предложение, сначала мы хотели бы кратко объяснить полиморфизм во время выполнения. Таким образом, он дает возможность методам вести себя по-разному в зависимости от объекта, на который он воздействует, что означает метод с тем же именем, но только логика получает изменения в соответствии с объектом.

Рассмотрим пример. Я создал один суперкласс с именем Engineer, имеющий метод work() внутри этого класса. Там есть два подкласса, такие как инженер-программист и инженер-механик, который расширяет или наследует суперкласс.

Как только эти дочерние классы наследуют суперкласс, метод work() также будет унаследован подклассами.

Поскольку работа, выполняемая обоими инженерами, полностью отличается друг от друга, поэтому логика или определение предусматривает, что метод work() в классе SoftwareEngineer всегда отличается от инженера-механика.

Следовательно, вы можете видеть, что мы используем один и тот же метод work() в обоих классах, но предоставляемая нами логика совершенно разная. Вот как переопределение методов помогает достичь полиморфизма времени выполнения в Java.

  1. Имя метода должно совпадать с именем, объявленным в суперклассе.
  2. Тип возвращаемого значения метода должен совпадать с объявленным в суперклассе.
  3. Сигнатура метода должна быть такой же, как объявлена ​​в суперклассе.
  4. Логика или реализация метода должны отличаться от метода суперкласса.

Примечание. Подпись того же метода в подклассе относится к любой из следующих точек.

  • Количество принимаемых методов при вызове должно быть таким же, как и в суперклассе.
  •  Параметры должны передаваться в той же последовательности в подклассе.
  • Тип данных параметра должен быть таким же, как в суперклассе.
Перегрузка метода Переопределение метода

Два или более метода могут иметь одно и то же имя, но разные сигнатуры.

Имя метода вместе с его сигнатурой должны быть такими же в дочерних классах, как и в суперклассе.

Метод перегрузки может быть выполнен в том же классе.

Переопределение метода возможно только в подклассе или дочернем классе суперкласса.
Наследование не требуется для достижения перегрузки метода. Без переопределения метода наследования невозможно.
Тип возвращаемого значения перегруженного метода может быть другим. Тип возвращаемого значения для переопределенного метода всегда должен быть одним и тем же.
Это помогает достичь полиморфизма времени компиляции в Java. Полиморфизм во время выполнения может быть достигнут путем переопределения метода.
  Не рекомендуется с точки зрения производительности.
Точка зрения памяти не рекомендуется. Подходит для использования, если вы предпочитаете экономить место в памяти.

UP Casting

Ссылка на суперкласс, ссылающаяся на любой из объектов своего подкласса или хранящая его адрес, тогда она называется Up Casting, то есть ссылка на объект относится к суперклассу, но объект принадлежит к его подклассу.

  1. В случае Up Casting, используя ссылку на суперкласс, мы не можем вызывать специфичный для подкласса метод и переменную.
  2. В Up Casting при использовании ссылки на суперкласс, когда мы вызываем или вызываем переопределенный метод, логика или реализация выполняются из подкласса.

Нисходящее литье

Тип подкласса или производного класса относится к объекту родительского класса, тогда это случай нисходящего литья.

  • Мы делаем downcast, чтобы получить доступ к конкретному поведению объекта типа подкласса.
  • Если преобразование вниз логически неверно, мы получаем ClassCastException во время выполнения в Java.

Блок экземпляра также называется блоком объекта, он определяется в классе фигурными скобками {}. Выполнение этого блока происходит во время создания объекта.

  1. Автоматически выполняется JVM во время создания объекта.
  2. Экземплярный блок может выполняться несколько раз, т. е. количество экземплярных блоков, которые выполняются, зависит от количества объектов.
  3. В классе может быть несколько блоков экземпляров.

Член данных является одним из содержимого класса наряду с конструктором и методами.

Элементы данных бывают двух типов.

  1. Переменные: Элементы данных, значение которых изменяется даже после объявления.
  2. Константа: как только постоянный элемент данных объявлен с некоторым значением, он не будет изменен нигде в коде. Мы используем ключевое слово final для постоянных элементов данных.
  • Мы можем инициализировать член данных во время объявления или мы можем просто объявить и инициализировать его позже.
  • Конечные данные-члены работают как константы, поэтому их следует инициализировать только во время объявления.
  1.  Переменные элементы данных: первая буква слова должна быть в НИЖНЕМ РЕГИСТРЕ, а первая буква следующего слова должна быть в ВЕРХНЕМ РЕГИСТРЕ.
  2. Постоянные элементы данных: Всегда используйте ПРОПИСНЫЕ БУКВЫ для переменной, которую мы делаем постоянной.

Большое спасибо за чтение моей статьи.