Слово «полиморфизм» буквально означает «состояние множества форм» или «способность принимать разные формы». Применительно к объектно-ориентированным языкам программирования, таким как Java, он описывает способность языка обрабатывать объекты различных типов и классов через единый унифицированный интерфейс.
Полиморфизм в Java имеет два типа: полиморфизм времени компиляции (статическое связывание) и полиморфизм времени выполнения (динамическое связывание). Перегрузка метода является примером статического полиморфизма, а переопределение метода — примером динамического полиморфизма.
Важным примером полиморфизма является то, как родительский класс ссылается на объект дочернего класса. Фактически, любой объект, который удовлетворяет более чем одной взаимосвязи IS-A, является полиморфным по своей природе.
Например, давайте рассмотрим класс AnimalCatAnimal Итак, любой кот — это животное. Здесь CatAnimal
Примечание. Также допустимо говорить, что каждый объект в 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()VehicleMotorBike Таким образом, когда выполняется вызов метода move() В этом случае объект относится к классу MotorBike Таким образом, будет вызван метод move()MotorBike Во втором вызове move()Vehicle Итак, будет вызван метод move()Vehicle
Поскольку вызываемый метод определяется во время выполнения, это называется динамическим или поздним связыванием .
Резюме:
Объект в Java, который проходит более одного теста IS-A, имеет полиморфный характер
Каждый объект в Java проходит минимум два теста IS-A: один для себя и один для класса Object
Статический полиморфизм в Java достигается перегрузкой метода
Динамический полиморфизм в Java достигается переопределением метода
Комментарии к этой статье закрыты. У вас есть вопрос о Java? Почему бы не спросить об этом на наших форумах ?