Словарное определение полиморфизма относится к принципу биологии, в соответствии с которым организм или вид может иметь множество различных форм или стадий. Этот принцип также может быть применен к объектно-ориентированному программированию и таким языкам, как язык Java. Подклассы класса могут определять свое собственное уникальное поведение и в то же время разделять некоторые функциональные возможности родительского класса.
Полиморфизм можно продемонстрировать с помощью незначительной модификации класса Bicycle. Например, в класс может быть добавлен метод printDescription, который отображает все данные, хранящиеся в данный момент в экземпляре.
public void printDescription(){ System.out.println("\nBike is " + "in gear " + this.gear + " with a cadence of " + this.cadence + " and travelling at a speed of " + this.speed + ". "); }
Чтобы продемонстрировать полиморфные возможности языка Java, расширьте класс Bicycle классами MountainBike и RoadBike. Для класса MountainBike добавьте поле для подвески, которое представляет собой строковое значение, указывающее, есть ли у велосипеда передний амортизатор, Front. Или у велосипеда есть передний и задний амортизаторы, Dual.
Вот обновленный класс:
public class MountainBike extends Bicycle { private String suspension; public MountainBike( int startCadence, int startSpeed, int startGear, String suspensionType){ super(startCadence, startSpeed, startGear); this.setSuspension(suspensionType); } public String getSuspension(){ return this.suspension; } public void setSuspension(String suspensionType) { this.suspension = suspensionType; } public void printDescription() { super.printDescription(); System.out.println("The " + "MountainBike has a" + getSuspension() + " suspension."); } }
Обратите внимание на переопределенный метод printDescription. В дополнение к информации, представленной ранее, в вывод включаются дополнительные данные о подвеске.
Далее создайте класс RoadBike. Поскольку дорожные или гоночные велосипеды имеют тонкие шины, добавьте атрибут для отслеживания ширины шины. Вот класс RoadBike:
public class RoadBike extends Bicycle{ // In millimeters (mm) private int tireWidth; public RoadBike(int startCadence, int startSpeed, int startGear, int newTireWidth){ super(startCadence, startSpeed, startGear); this.setTireWidth(newTireWidth); } public int getTireWidth(){ return this.tireWidth; } public void setTireWidth(int newTireWidth){ this.tireWidth = newTireWidth; } public void printDescription(){ super.printDescription(); System.out.println("The RoadBike" + " has " + getTireWidth() + " MM tires."); } }
Обратите внимание, что метод printDescription снова был переопределен. На этот раз выводится информация о ширине шины.
Подводя итог, можно сказать, что существует три класса: Bicycle, MountainBike и RoadBike. Два подкласса переопределяют метод printDescription и выводят уникальную информацию.
Ниже приведена тестовая программа, которая создает три переменные Bicycle. Каждая переменная присваивается одному из трех классов велосипедов. Затем каждая переменная выводится на печать.
public class TestBikes { public static void main(String[] args){ Bicycle bike01, bike02, bike03; bike01 = new Bicycle(20, 10, 1); bike02 = new MountainBike(20, 10, 5, "Dual"); bike03 = new RoadBike(40, 20, 8, 23); bike01.printDescription(); bike02.printDescription(); bike03.printDescription(); } }
Ниже приведен вывод тестовой программы:
Bike is in gear 1 with a cadence of 20 and travelling at a speed of 10. Bike is in gear 5 with a cadence of 20 and travelling at a speed of 10. The MountainBike has a Dual suspension. Bike is in gear 8 with a cadence of 40 and travelling at a speed of 20. The RoadBike has 23 MM tires.
Виртуальная машина Java (JVM) вызывает соответствующий метод для объекта, на который ссылается каждая переменная. Она не вызывает метод, который определен типом переменной. Такое поведение называется виртуальным вызовом метода и демонстрирует один из аспектов важной функции полиморфизма в языке Java.