Відповіді:
Для перевантаження методу новим методом новий метод повинен мати інший підпис. Тобто два перевантажені методи мають однакову назву, але різні параметри. Ось приклад двох перевантажених методів:
boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };
На основі типів параметрів буде викликаний відповідний метод. Зауважте, що змінити тип повернення недостатньо (хоча ви можете зробити це додатково).
Коли метод переосмислюється, то новий метод має ту саму підпис і замінює метод переопределення в деяких випадках. Ось приклад перекритого методу:
public class A
{
public void someMethod() { ... }
}
public class B extends A
{
public void someMethod() { ... }
}
Вибір робиться на основі типу об'єкта. Наприклад,
A someA = new B();
someA.someMethod();
викликатиме someMethodз B. Ви можете (і повинні) додати анотацію @Override:
public class B extends A
{
@Override
public void someMethod() { ... }
}
Тепер, якщо ви випадково змінили параметри в B, компілятор повідомить вас, що ви не переосмислюєте деякийMethod (), але перевантажуєте його.
Перевантажуючи, методи мають однакову назву, але різні параметри.
Переважно, реалізація, що задається в базовому класі, замінюється на підклас.
Концепції, про які ви запитуєте, містяться в навчальних посібниках Java.
Пояснення щодо переосмислення надається наступним чином:
Метод екземпляра в підкласі з однаковою підписом (ім'я, плюс число та тип його параметрів) та тип повернення як метод екземпляра в суперкласі перекриває метод надкласу.
Здатність підкласу переосмислити метод дозволяє класу успадкувати надклас, поведінка якого "досить близький", а потім змінювати поведінку за потребою. Метод переосмислення має те саме ім'я, кількість та тип параметрів та тип повернення, що і метод, який він перекриває. Метод переопределення також може повернути підтип типу, повернутий методом переопределення. Це називається коваріантним типом повернення .
При заміні методу, можливо, ви захочете використовувати
@Overrideанотацію, яка вказує компілятору, що ви маєте намір замінити метод у надкласі. Якщо з якоїсь причини компілятор виявить, що метод не існує в одному з надкласів, він створить помилку. Для отримання додаткової інформації@Overrideдив. Анотації ...
Перевантаження пояснюється в підручнику так:
Мова програмування Java підтримує методи перевантаження, і Java може розрізняти методи з різними підписами методів. Це означає, що методи всередині класу можуть мати одне ім’я, якщо вони мають різні списки параметрів (до цього є деякі кваліфікації, які будуть обговорені на уроці під назвою "Інтерфейси та спадкування".
Припустимо, у вас є клас, який може використовувати каліграфію для малювання різних типів даних (рядків, цілих чисел тощо), який містить метод для малювання кожного типу даних. Він громіздкий використовувати нове ім'я для кожного методу, наприклад,
drawString,drawInteger,drawFloatі так далі. У мові програмування Java ви можете використовувати одне ім’я для всіх методів малювання, але передати інший список аргументів кожному методу. Таким чином, клас малювання даних може оголосити чотири названих методуdraw, кожен з яких має інший список параметрів ...Перевантажені методи диференціюються за кількістю та типом аргументів, переданих у метод ...
Ви не можете оголосити більше одного методу з тим же ім'ям і тим самим числом і типом аргументів, оскільки компілятор не може їх розрізнити.
Компілятор не враховує тип повернення при диференціації методів, тому ви не можете оголосити два методи з однаковою підписом, навіть якщо вони мають інший тип повернення.
Примітка. Перевантажені методи повинні використовуватися мало, оскільки вони можуть зробити код менш читабельним.
Вище пояснення щодо перевантаження згаданих кваліфікацій, обговорених на уроці під назвою "Інтерфейси та спадкування" :
У підкласі ви можете перевантажувати методи, успадковані від надкласу. Такі перевантажені методи ні приховують, ні перекреслюють методи надкласу - це нові методи, унікальні для підкласу.
Метод перевантаження зазвичай визначається як "надання декількох доступних методів з однаковою назвою, що відрізняються за кількістю та типом входів і виходів". Концепція зазвичай полягає в тому, що ви хочете мати можливість виконувати одну і ту ж основну операцію з урахуванням різних наборів входів: ви можете, наприклад, "додати" будь-які два значення числового типу, проте зазвичай важливо знати, який саме тип значення полягає в тому, що ви можете скористатися або планувати конкретні поведінки цього типу. Як такий, ви б визначили метод для кожної комбінації числових типів (і колекцій), які ви хочете підтримати. Усі ці методи мають однакову назву, але різні "підписи"; під час компіляції,
Перевизначення методу зазвичай визначається як "надання різної реалізації у похідному класі методу з певним підписом, визначеним у базовому класі". Існує багато причин перекриття методу; практично всі вони мають спільний факт, що похідний клас має додаткові знання про те, що необхідно зробити, що не може бути відомо базовим класом. У більшості мов ОО є два найважливіших смаку; переосмислення може замінити метод базового класу, або він може поширитисьметод базового класу. Різниця зазвичай полягає в тому, що похідний клас, який розширює реалізацію базового класу, буде викликати перезаписану версію методу базового класу в якийсь момент під час виконання методу переосмислення. Це дозволяє переосмислити класи для "повторного використання" загальних областей операції, які містяться в базовому класі.