Слово «полиморфизм» буквально означает «состояние множества форм» или «способность принимать разные формы». Применительно к объектно-ориентированным языкам программирования, таким как Java, он описывает способность языка обрабатывать объекты различных типов и классов через единый унифицированный интерфейс.
Полиморфизм в Java имеет два типа: полиморфизм времени компиляции (статическое связывание) и полиморфизм времени выполнения (динамическое связывание). Перегрузка метода является примером статического полиморфизма, а переопределение метода — примером динамического полиморфизма.
Важным примером полиморфизма является то, как родительский класс ссылается на объект дочернего класса. Фактически, любой объект, который удовлетворяет более чем одной взаимосвязи IS-A, является полиморфным по своей природе.
Например, давайте рассмотрим класс Animal
Cat
Animal
Итак, любой кот — это животное. Здесь Cat
Animal
Примечание. Также допустимо говорить, что каждый объект в Java является полиморфным по своей природе, поскольку каждый из них проходит тест IS-A для себя, а также для класса Object
Статический полиморфизм:
В Java статический полиморфизм достигается за счет перегрузки методов. Перегрузка метода означает, что в классе есть несколько методов, имеющих одинаковое имя, но разные типы / порядок / количество параметров.
Во время компиляции Java знает, какой метод вызывать, проверяя сигнатуры метода. Итак, это называется полиморфизмом времени компиляции или статическим связыванием . Концепция будет понятна из следующего примера:
class DemoOverload{
public int add(int x, int y){ //method 1
return x+y;
}
public int add(int x, int y, int z){ //method 2
return x+y+z;
}
public int add(double x, int y){ //method 3
return (int)x+y;
}
public int add(int x, double y){ //method 4
return x+(int)y;
}
}
class Test{
public static void main(String[] args){
DemoOverload demo=new DemoOverload();
System.out.println(demo.add(2,3)); //method 1 called
System.out.println(demo.add(2,3,4)); //method 2 called
System.out.println(demo.add(2,3.4)); //method 4 called
System.out.println(demo.add(2.5,3)); //method 3 called
}
}
В приведенном выше примере есть четыре версии методов add
Первый метод принимает два параметра, а второй — три. Для третьего и четвертого способов происходит изменение порядка параметров. Компилятор просматривает сигнатуру метода и решает, какой метод вызвать для конкретного вызова метода во время компиляции.
Динамический полиморфизм:
Предположим, что подкласс переопределяет конкретный метод суперкласса. Допустим, мы создаем объект подкласса и присваиваем его ссылке на суперкласс. Теперь, если мы вызовем переопределенный метод для ссылки на суперкласс, то будет вызвана версия метода для подкласса.
Посмотрите на следующий пример.
class Vehicle{
public void move(){
System.out.println(“Vehicles can move!!”);
}
}
class MotorBike extends Vehicle{
public void move(){
System.out.println(“MotorBike can move and accelerate too!!”);
}
}
class Test{
public static void main(String[] args){
Vehicle vh=new MotorBike();
vh.move(); // prints MotorBike can move and accelerate too!!
vh=new Vehicle();
vh.move(); // prints Vehicles can move!!
}
}
Следует отметить, что при первом вызове метода move()
Vehicle
MotorBike
Таким образом, когда выполняется вызов метода move()
В этом случае объект относится к классу MotorBike
Таким образом, будет вызван метод move()
MotorBike
Во втором вызове move()
Vehicle
Итак, будет вызван метод move()
Vehicle
Поскольку вызываемый метод определяется во время выполнения, это называется динамическим или поздним связыванием .
Резюме:
Объект в Java, который проходит более одного теста IS-A, имеет полиморфный характер
Каждый объект в Java проходит минимум два теста IS-A: один для себя и один для класса Object
Статический полиморфизм в Java достигается перегрузкой метода
Динамический полиморфизм в Java достигается переопределением метода
Комментарии к этой статье закрыты. У вас есть вопрос о Java? Почему бы не спросить об этом на наших форумах ?