Полиморфизм в Java: как перегрузить или переопределить методы

Перегрузка и переопределение методов – два способа демонстрации полиморфизма в Java. Полиморфизм происходит от комбинации двух греческих слов: «поли», означающего «много», и «морф», означающего форму. Следовательно, полиморфизм позволяет методам принимать разные формы.

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

Что такое перегрузка метода?

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

Компилятор знает, какой метод использовать, проверяя тип, количество параметров и порядок их размещения.

Связанный: Изучение наследования на языке программирования Java

Перегрузка метода демонстрирует полиморфизм времени компиляции. Полиморфизм во время компиляции означает, что компилятор Java связывает объект с его функциональными возможностями во время выполнения. Для этого компилятор проверяет сигнатуры методов.

Этот тип полиморфизма также известен как статическое или раннее связывание.

См. Пример перегрузки метода ниже:

 class Arithmetic{
int cube(int x){
return x*x*x;
}
double cube(double x){
return x*x*x;
}
float cube(float x){
return x*x*x;
}
public static void main(String[] args){
Arithmetic myMultiplication = new Arithmetic();
System.out.println("The cube of 5 is " + myMultiplication.cube(5));
System.out.println("The cube of 5.0 is " + myMultiplication.cube(5.0));
System.out.println("The cube of 0.5 is " + myMultiplication.cube(0.5));
}
}

Выход:

 The cube of 5 is 125
The cube of 5.0 is 125.0
The cube of 0.5 is 0.125

В приведенном выше коде показано, как одним и тем же методом получить куб разных типов ( int , double , float ).

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

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

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

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

Переопределение обычно используется для включения в подкласс конкретной реализации поведения объекта.

 class Account{
public void message() {
System.out.println("
Thank you for opening an account with us!");
}
public static void main(String args[]) {
Account myAccount = new Account();
Savings mySavings = new Savings();
FixedDeposit myFixedDepo = new FixedDeposit();
myAccount.message();
mySavings.message();
myFixedDepo.message();
}
}
class Savings extends Account {
public void message() {
System.out.println("
Thank you for opening a Savings account with us!");
}
}
class FixedDeposit extends Account {
public void message() {
System.out.println("
Thank you for opening a Fixed Deposit account with us!");
}
}

Выход:

 Thank you for opening an account with us!
Thank you for opening a Savings account with us!
Thank you for opening a Fixed Deposit account with us!

В приведенном выше примере показано, как метод message () переопределяется в подклассах Savings и FixedDeposit . Для владельцев банковских счетов со сберегательным счетом и со счетом фиксированного депозита будут отображаться разные сообщения.

Связано: что вам нужно знать об использовании строк в Java

Также стоит отметить, что переопределение метода демонстрирует полиморфизм времени выполнения или динамическую отправку метода. Это означает, что вызываемый метод разрешается во время выполнения, а не при компиляции.

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

 final void message (){
System.out.println("
Thank you for opening an account with us!");
}

Когда подкласс пытается переопределить его, возникает ошибка компиляции.

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

Иногда вам может потребоваться доступ к переопределенному методу в переопределяющем методе. В этом случае вы можете использовать ключевое слово super, за которым следует оператор точка ( . ) И имя метода.

Рассмотрим суперкласс Animal .

 class Animal{
public void move() {
System.out.println("
I can move.");
}
}

Ниже приведен подкласс Fish , который переопределяет move () :

 class Fish extends Animal {
public void move() {
System.out.println("
I can swim.");
super.move();
}
public static void main(String args[]){
Fish Tilapia = new Fish();
Tilapia.move();
}
}

Выход:

 I can swim.
I can move.

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

Простой код с полиморфизмом

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

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

Удачи, вы не упростили свой код … Теперь вы получите настоящий урок криптографии. Использование эффективных структур данных и все возможное для сокращения кода (например, помня о DRY) – ваша лучшая защита от такой ситуации.

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