Полиморфизм в 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 . Для владельцев банковских счетов со сберегательным счетом и со счетом фиксированного депозита будут отображаться разные сообщения.
Также стоит отметить, что переопределение метода демонстрирует полиморфизм времени выполнения или динамическую отправку метода. Это означает, что вызываемый метод разрешается во время выполнения, а не при компиляции.
Чтобы избежать переопределения метода, используйте ключевое слово 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 должна быть работа с массивами. Это важные структуры данных, используемые для хранения пакетов точек данных.